成员对象和成员函数是分开储存的
只有非静态的成员变量储存在了类上,是实际的占空间的。
class Person{public:int m_a; //非静态成员变量,属于类的对象上static int m_b; //静态成员变量,不输于类的对象上void fun() {}; //非静态成员函数,不属于static void fun2() {};//静态成员函数,不属于};
class Person {public:Person() {mA = 0;}//非静态成员变量占对象空间int mA;//静态成员变量不占对象空间static int mB;//函数也不占对象空间,所有函数共享一个函数实例void func() {cout << "mA:" << this->mA << endl;}//静态成员函数也不占对象空间static void sfunc() {}};int main() {cout << sizeof(Person) << endl;system("pause");return 0;}
this 指针
this指针有两点用途
- 解决名称冲突
 - 返回对象本身用*this
 
解决形参的名称冲突,见以下实例:
#include <iostream>#include <string>using namespace std;class Person{public:Person(int age) {this->age = age;}int age;};void main() {Person p(18);cout << p.age;}
当传入的形参变量名和成员变量名相同时,使用this,因为this指向了这个类的对象。
所以使用类似于链表中的指针来访问成员。
#include <iostream>#include <string>using namespace std;class Person{public:Person(int age) {this->age = age;}//返回值类型是引用,引用只是原对象的一个别名,如果不是引用,则返回一个新的类Person& AddAge(Person &p) {this->age += p.age;return *this;//this指向Person,*this就是person,返回值类型也是Person,但是需要引用}int age;};void main() {Person p(18);Person p2(10);p.AddAge(p2).AddAge(p2).AddAge(p2);cout << p.age;system("pause");}
c++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
this指针的用途:
- 当形参和成员变量同名时,可用this指针来区分
 - 在类的非静态成员函数中返回对象本身,可使用return *this
class Person{public:Person(int age){//1、当形参和成员变量同名时,可用this指针来区分this->age = age;}Person& PersonAddPerson(Person p){this->age += p.age;//返回对象本身return *this;}int age;};void test01(){Person p1(10);cout << "p1.age = " << p1.age << endl;Person p2(10);p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);cout << "p2.age = " << p2.age << endl;}int main() {test01();system("pause");return 0;}
 
