C++学习笔记(1)

来源:互联网 发布:上海趣味网络 编辑:程序博客网 时间:2024/06/03 19:53

1.多级指针的理解(指针数组):

可以这样理解:二级指针是一个指向数组首地址的指针,而这个数组所存放的内容也是指针.即所谓的指针数组.下面是一个二级指针的实例(暂时只适合char型二维数组):

   #include<iostream.h>

void main()

{

       char **pp;

       static char *name[]={ "fowenler",//指针数组及其内容的定义.

                                     "owen",

                                     "stela",

                                     "army",

                         ""};                                

       pp=name;

       cout<<pp<<endl;//output the address

    cout<<*pp<<endl;//output "fowenler"

    cout<<**pp<<endl;//output 'f'

       cout<<name<<endl;//output the address

       cout<<name[1]<<endl;//output "owen"

       cout<<name[1][1]<<endl;//output 'w'

}

2.数组指针

       定义: <存储类> <数据类型> (*数组指针名)[元素个数]; :int (*ap)[10];

       对上式从运算符优先级来分析,( )[ ]的优先级都是最高级,则按从左至右的结合规则来解释.首先看圆括号内的表达式,ap表示首先它是一个指针变量,然后才与方括号结合起来解释为:该指针变量与以前的指针变量不同,不是指向一个int型的变量或者int型数组元素,而是指向包含10int型元素的一维数组整体.因此它所指的对象,已经不是一个元素,而是整个一维数组.

   下面是使用数组指针的一个例子:

       #include<iostream.h>

void main()

{

       char ch[10];

       char (*p)[];

    char *temp;   

       temp="fowenler";//define a string

       for(int i=0;i<10;i++)//copy the string to ch[10]

              ch[i]=*temp++;

       cout<<ch<<endl;//output ch,display:fowenler

       p=(char (*)[])ch;//copy ch to p

       cout<<*p<<endl;//display:fowenler

       cout<<*p+2<<endl;//address add 2,display:wenler

       cout<<*(*p+2)<<endl;//show the content,is a char:w

}

 

3.关于this指针:

       this指针是存在于类的非静态成员函数的,它指向类的实例.即同一个类的不同实例有它自己的this指针,this是函数所在对象的地址.正是这个this指针让成员函数知道是哪个实例调用了它.

this指针是隐式定义的,每个成员函数都有一个this指针,下面举例子说明:

#include<iostream.h>
class Point
{ int x, y;
public:
Point(int a, int b) { x=a; y=b;}
Void MovePoint( int a, int b){ x+=a; y+=b;}
Void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
};
void main( )
{
Point point1( 10,10);
point1.MovePoint(2,2);
point1.print( );
}

当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。
MovePoint
函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:
void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}
即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。
即该函数过程可写成 point1.x+= a; point1. y + = b;

下面再对this指针作一下总结:

(1).为什么要有this指针:
当成员函数引用该类特定对象的另一个成员时,C++是如何保证该函数正确的引用了该对象呢?

(2).this
指针的作用:
每一个对象的非静态成员函数都可以通过使用this指针来确定其所在对象的地址,即在该对象自己的成员函数引用其对象内部的成员的时候,this只是一个隐含的参数,用来引用该对象的数据成员和成员函数。

(3).this
指针的类型(const or not const
对于类A的非const成员函数,this指针的类型为A * (指向类A的对象的常量指针),对于类A const成员函数来说,this指针的类型为const A *(指向类A的常量对象的常量指针),该指针不能赋值也不能取地址,只能被该对象的非静态成员函数使用。

(4).
谁可以使用this
每个该类的非静态成员函数都有权通过访问指向该对象的this指针来调用该对象的成员。

原创粉丝点击