4、什么情况下需要手动加上this:
class Student { public: char name[50]; int num; int age; public: void set_age(int age) { age = age; }; };
大家看到了吗?set_age 函数的参数名字和成员变量的名字一样,都是age,那么这样的情况下,大家说说成员变量的age是否能真的赋值呢?大家不妨先把视频教程暂停,自己实践下,之后再继续播放教程!
不同的编译器可能实现的结果不同,但是在我们的vs2013中,答案是否定的。成员变量age并没有通过函数 set_age 被正确的赋值。那么这个时候怎么办呢?解决的方法是将 set_age 函数改成如下:
void set_age(int age) { this->age = age; };
5、小作业:
自己查找资料,详细说明this指针的作用域是哪里?
为什么引用this指针?
当我们在类中定义了一个变量,同时又在类成员函数中定义了同一个变量时,也就是变量名重复时,但是我们要想使用类中的定义的变量,此时就需要this指针了。
1.this指针的作用
指针存在于类的成员函数中,指向被调用函数类实例的地址。
一个对象的this指针并不是对象本身的一部分,不会影响sizeof()的结果。
this指针的作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。换句话说就是,及时你没有用this指针,编译器在编译的时候也会自动加上this的,它是一个隐含形参,对各成员的访问均通过this进行。
2.this指针的使用
(1)在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;
(2)当参数与函数成员变量名相同时,应使用 this.age = age;
3.this指针的特点
(1)this指针只能在成员函数中使用
全局函数,静态函数都不能使用this指针,其实,成员函数的第一个默认参数是 *const this
例:class Student()
{
int fun(int x)
{
}
};
函数fun(int x)的原型在编译器看来就是 fun(Student *const this ,int x)
(2)this 指针在成员函数的开始前构造,在成员函数的结束后清除,生命周期和其他函数参数一样。当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。
如:Student stu;
stu.fun(3);
此时编译器会编译成:
Student::fun(&x,3);
(3)this指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全局变量。
在汇编级 别里面,一个值只会以3种形式出现:立即数、寄存器值和内存变量值。不是存放在寄存器就是存放在内 存中,它们并不是和高级语言变量对应的。
原文:https://www.cnblogs.com/SakuraQAQ/p/14241966.html