要了解“this” 指针, 重要的是要理解对象如何对待类的函数和数据成员。
- 每个对象都有本人的数据成员正本。
- 全副拜访与代码段中雷同的性能定义。
意味着每个对象都有本人的数据成员正本, 并且所有对象共享成员函数的单个正本。
当初的问题是, 如果每个成员函数只有一个正本并且被多个对象应用, 那么如何拜访和更新适当的数据成员?
- 编译器提供隐式指针以及函数名称 ” this”。
- ” this” 指针作为暗藏参数传递给所有非动态成员函数调用, 并且可用作所有非动态函数体内的局部变量。
- ” this” 指针在动态成员函数中不可用, 因为能够在没有任何对象 (带有类名) 的状况下调用动态成员函数。
- 对于 X 类, this 指针的类型为 ” X “。另外, 如果 X 的成员函数申明为 const, 则 this 指针的类型为 ” const X “
- 在晚期的 C ++ 版本中, ” this” 指针将被更改;通过这样做, 程序员能够更改办法正在解决的对象。该性能最终被删除, 当初在 C ++ 中为 r 值。
C ++ 通过调用以下代码让对象销毁本身:
delete this ;
正如 Stroustrup 所说, “this” 可能是指针的参考, 但在 C ++ 的晚期版本中没有该参考。如果将 ” this” 用作参考, 则能够防止上述问题, 并且比指针更平安。
以下是应用 ” this” 指针的状况:
1)当本地变量的名称与成员的名称雷同时
#include<iostream>
using namespace std;
/* local variable is same as a member's name */
class Test
{
private :
int x;
public :
void setX (int x)
{
// The 'this' pointer is used to retrieve the object's x
// hidden by the local variable 'x'
this ->x = x;
}
void print() { cout << "x =" << x << endl;}
};
int main()
{
Test obj;
int x = 20;
obj.setX(x);
obj.print();
return 0;
}
输入如下:
x = 20
对于构造函数, 初始化列表当参数名称与成员名称雷同时也能够应用。
2)返回对调用对象的援用
/* Reference to the calling object can be returned */
Test& Test::func ()
{
// Some processing
return * this ;
}
当返回对本地对象的援用时, 返回的援用可用于链函数调用在单个对象上。
#include<iostream>
using namespace std;
class Test
{
private :
int x;
int y;
public :
Test(int x = 0, int y = 0) {this ->x = x; this ->y = y;}
Test &setX(int a) {x = a; return * this ;}
Test &setY(int b) {y = b; return * this ;}
void print() { cout << "x =" << x << "y =" << y << endl;}
};
int main()
{Test obj1(5, 5);
// Chained function calls. All calls modify the same object
// as the same object is returned by reference
obj1.setX(10).setY(20);
obj1.print();
return 0;
}
输入如下:
x = 10 y = 20
预测以下程序的输入。如果存在编译谬误, 请修复它们。
问题 1
#include<iostream>
using namespace std;
class Test
{
private :
int x;
public :
Test(int x = 0) {this ->x = x;}
void change(Test *t) {this = t;}
void print() { cout << "x =" << x << endl;}
};
int main()
{Test obj(5);
Test *ptr = new Test (10);
obj.change(ptr);
obj.print();
return 0;
}
问题 2
#include<iostream>
using namespace std;
class Test
{
private :
int x;
int y;
public :
Test(int x = 0, int y = 0) {this ->x = x; this ->y = y;}
static void fun1() { cout << "Inside fun1()" ; }
static void fun2() { cout << "Inside fun2()" ; this ->fun1();}
};
int main()
{
Test obj;
obj.fun2();
return 0;
}
问题 3
#include<iostream>
using namespace std;
class Test
{
private :
int x;
int y;
public :
Test (int x = 0, int y = 0) {this ->x = x; this ->y = y;}
Test setX(int a) {x = a; return * this ;}
Test setY(int b) {y = b; return * this ;}
void print() { cout << "x =" << x << "y =" << y << endl;}
};
int main()
{
Test obj1;
obj1.setX(10).setY(20);
obj1.print();
return 0;
}
问题 4
#include<iostream>
using namespace std;
class Test
{
private :
int x;
int y;
public :
Test(int x = 0, int y = 0) {this ->x = x; this ->y = y;}
void setX(int a) {x = a;}
void setY(int b) {y = b;}
void destroy() { delete this ;}
void print() { cout << "x =" << x << "y =" << y << endl;}
};
int main()
{
Test obj;
obj.destroy();
obj.print();
return 0;
}
如果发现任何不正确的中央, 或者想分享无关上述主题的更多信息, 请发表评论。
更多 C ++ 开发相干内容请参考:lsbin – IT 开发技术:https://www.lsbin.com/
查看以下 C ++ 相干的内容:
- C/C++ 中的函数:https://www.lsbin.com/3559.html
- C++ 指针和援用的区别:https://www.lsbin.com/3381.html
- C++ 多线程编程:https://www.lsbin.com/2910.html