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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)