学到哪里是哪里,关于this指针,摘录目前自己需要的部分,更多的待以后补充
this指针容易混淆点
1) 什么是this指针?
this是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。举例来说:当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身。
2) this指针的作用是什么?
this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子:
void Date::setMonth( int mn )
{
month = mn; // 这三句是等价的
this->month = mn;
(*this).month = mn;
}
1. this只能在成员函数中使用。
全局函数,静态函数都不能使用this。
实际上,成员函数默认第一个参数为T* const register this。
如:
class A{public: int func(int p){}};
其中,func的原型在编译器看来应该是: int func(A* const register this, int p);
相当于以下代码:
class student
{
public:
void Infostudent(char * name, char* gender, int age)
//实际为void Infostudent(student *const this,char *name ,char *gender,int age);
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void Printstudent()
{
cout << _name << "\n" << _gender << "\n" << _age << endl;
}
private:
char _name[20];
char _gender[4];
int _age;
};
由文中注释可知,类中的第一参数 name 便是 this 指针的地址。
类中的就近原则:
(1)在成员函数中,当局部变量与成员变量重名时,该变量指向的是局部变量。
class Object
{
public:
int x; // 成员变量
voic Test(int x)
{
printf("x = %d \n", x); // 最近的,函数内定义的x
}
};
此时若是在main()中输入:
x = 1,
Object obj;
obj.Test(2); 此时输出x = 1;
如果指定成员变量x,则必须加上this->的限定,即:
class Object
{
public:
int x;
void Test(int x)
{
printf("x = %d \n", this->x);
}
}
如前面所说的,此时调用Test()函数,
Object obj;
obj.Test(2); 则打印出来是2。
(2)在成员函数里,当成员函数与全局变量重名时,该变量指向的是成员变量
int x = 10; // 全局变量
class Object
{
public:
int x;
void Test(int)
{
printf("x = %d \n", x); // 最近的x,成员变量x
}
}
int main()
{
Object obj;
obj.x = 1;
obj.Test();
}
此时打印出来的x = 1,如果要调用全局变量,则要加上::x
如果要打印全局变量,则函数如下:
Test()
{
printf("x = %d \n", ::x);
}
同理成员函数和全局函数