C++Note 类中成员变量 this指针

成员变量和非成员变量(静态和非静态):

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 //类内的成员变量和成员函数是分开存储的
 5 //只有非静态成员变量才属于类的对象上
 6 class Person1
 7 {
 8     //空类
 9 };
10 class Person2
11 {
12     int m_A;//非静态成员变量   属于类的对象上
13     static int m_B;//静态成员变量   不属于类的对象上
14     void func() {};//非静态成员函数   不属于类的对象上
15     static void func2() {};//静态成员函数 不属于类的对象上
16 };
17 int Person2::m_B = 10;//类内声明 类外初始化
18 void test01()
19 {
20     Person1 p;
21     //空对象占用内存空间为: 1 (对象的地址)
22     //C++会给每个空对象分配一个字节空间 是为了区分空对象占内存的位置
23     // 每个空对象也应该有一个独一无二的内存地址
24     cout << "sizeof of p = " << sizeof(p) << endl;//1 (对象的地址)
25     //含有非静态变量的类
26     Person2 p2;
27     cout << "sizeof of p2 = " << sizeof(p2) << endl;//4   整型
28 }
29 
30 int main()
31 {
32     test01();
33     system("pause");
34     return 0;
35 }
复制代码

this指针:

成员变量和成员函数是分开存储的;

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码那么这一块代码是如何区分那个对象调用自己呢?

this指针指向被调用的成员函数所属的对象

this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可

this指针的用途:
1.当形参和成员变量同名时,可用this指针来区分
2.在类的非静态成员函数中返回对象本身,可使用 return *this 

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 //1.解决名称冲突
 5 class Person
 6 {
 7 public:
 8     Person(int age)
 9     {
10         this->age = age;//this指针指向的是 被调用的成员函数所属的对象  
11         //test()中  此时  this->age 指向为 p1.age
12     }
13     int age;
14 };
15 void test()
16 {
17     Person p1(20);
18     cout << "p的年龄:" << p1.age << endl;
19 }
20 
21 int main()
22 {
23     test();
24     system("pause");
25     return 0;
26 }
复制代码

2.返回对象本身用  *this

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 //2.返回对象本身用  *this
 5 class Person
 6 {
 7 public:
 8     Person(int age)
 9     {
10         this->age = age;
11     }
12     void PersonAddAge(Person& p)
13     {
14         this->age += p.age;//将Person自身的age 与传入进来的p的age相加传给自身
15     }
16     int age;
17 };
18 
19 void test()
20 {
21     Person p1(10);
22     Person p2(10);
23     p2.PersonAddAge(p1);//将p1的年龄传入到p2的函数中相加
24     //p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
25     //错误 返回为空 若返回为p2即可继续调用
26     cout << "p2的年龄为:" << p1.age << endl;
27     cout << "p2的年龄为:" << p2.age << endl;
28 }
29 
30 int main()
31 {
32     test();
33     system("pause");
34     return 0;
35 }
复制代码

返回对象

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 //2.返回对象本身用  *this
 4 class Person
 5 {
 6 public:
 7     Person(int age)
 8     {
 9         this->age = age;
10     }
11     Person& PersonAddAge(Person& p)//引用返回
12     {
13         this->age += p.age;
14         return *this;// 此时 返回 p2对象本身(*this) 继续调用 
15     }
16     Person PersonAddAge1(Person& p)//值返回
17     {
18         this->age += p.age;
19         return *this;
20     }
21     int age;
22 };
23 void test()
24 {
25     Person p1(10);
26     Person p2(10);
27     p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);//链式编程
28     //引用返回  p2(10)+10  --> p2(10)+10+10 --> p2(10)+10+10+10
29     p2.PersonAddAge1(p1).PersonAddAge1(p1);
30     //值返回 p2(10)+10 --> p2'(10)+10  --> p2''(10)+10
31     cout << "p2的年龄为:" << p2.age << endl;
32 }
33 int main()
34 {
35     test();
36     system("pause");
37     return 0;
38 }
复制代码

 

posted on   廿陆  阅读(11)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示