【C++】对象模型和this指针
目录
一、成员变量和成员函数分开存储
二、this指针概念
三、空指针访问成员函数
四、const修饰成员函数
一、成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上
①C++编译器会给每一个空对象分配一个字节的空间,为了区分空对象占内存的位置
class Person
{}void test()
{Person P;//空类(类中什么也没有)中的空对象所占内存空间为 1cout << sizeof(P) << endl;
}
②非空类所占内存空间
class Person
{int m_A; //非静态成员变量 属于类对象上的数据static int m_B;//静态成员变量 不属于类对象void func(){}//非静态成员函数 不属于类对象static void func2(){}//静态成员函数 不属于类对象
};int Person::m_B = 0;void test()
{Person P;//所占内存为4cout << sizeof(P) << endl;
}
二、this指针概念
this指针指向被调用的成员函数所属对象
用途:①当形参和成员变量同名时,可用this指针区分
②在类的非静态成员函数中返回对象本身,可使用return *this
class Person
{
public:Person(int age){//this指针指向被调用成员函数 所属对象this->age = age;}//如果用Person&一直返回一个对象;如果用Person就会复制新对象Person& add(Person &p){this->age += p.age;//this指向p2指针,而*this指向p2这个对象的本体return *this;}int age;
};//解决名称冲突
void test()
{Person p1(18);cout << "p1年龄:" << p1.age << endl;
}//返回对象本身用*this
void test2()
{Person p1(10);Person p2(10);//链式编程思想p2.add(p1).add(p1).add(p1).add(p1);cout << "p2年龄:" << p2.age << endl;return ;
}
三、空指针访问成员函数
class Person
{
public:void showClassName(){cout << "This is Person class" << endl;}//处理后提高代码健壮性void showPersonAge(){if(this == NULL){return;}cout << "age =" << this->m_Age << endl;}int m_Age;};void test()
{Person * p = NULL; //创建空指针P->showClassName(); //可以直接调用p->showPersonAge(); //因为该函数的属性是当前对象的属性,如果用空指针(没有对象)就没办法访问里面的属性
}
四、const修饰成员函数
常函数:
1、成员函数后加const后称该函数为常函数
2、常函数内不可以修改成员顺序ing
3、成员属性声明时加关键字mutable后,在常函数中依然可以修改
class Person
{
public://this指针的本质是指针常量 指针指向不可以修改//在成员函数后加const,修饰的是this指向,让指针指向的值也不可以修改//常函数:void showPerson() const //相当于 const Person * const this{//函数后面加了const后变量不可修改//this->m_A = 100; 该行报错this->m_B = 100;}int m_A;mutable int m_B; //特殊变量,在常函数中也可以修改该值
};
常对象:
1、声明对象前加const称该对象为常对象
2、常对象只能调用常函数
class Person
{
public:void showPerson() const{m_B = 100;}void func(){m_A = 100;}int m_A;mutable int m_B; //特殊变量,在常函数中也可以修改该值
};void test()
{//常对象:const Person p;p.m_A = 100;//不可以修改p.m_B = 100;//m_B是特殊值,在常对象下可以修改//常对象只能调用常函数p.showPerson();//可以运行p.func();//报错 不能运行
}