千家信息网

C++对象模型与this指针怎么使用

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇"C++对象模型与this指针怎么使用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这
千家信息网最后更新 2025年01月19日C++对象模型与this指针怎么使用

这篇"C++对象模型与this指针怎么使用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C++对象模型与this指针怎么使用"文章吧。

C++面向对象的三大特性为:封装、继承、多态

C++认为万事万物都皆为对象,对象上有其属性和行为

例如:

人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌…

车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐、放空调…

具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类

C++对象模型和this指针

1 成员变量和成员函数分开存储

在C++中,类内的成员变量和成员函数分开存储

  • 空对象占一个字节;

  • c++编译器会给每一个空对象也分配一个字节的空间,是为了区分空对象占内存的位置

  • 每个空对象也应该有一个独一无二的内存地址。

  • 非静态成员变量,属于类的对象上

  • 静态成员变量,不属于类的对象上

  • 非静态成员函数,不属于类的对象上

  • 静态成员函数,不属于类的对象上

  • 非静态成员变量,属于类的对象上,why?

空对象本来占1个字节,在添加非静态成员变量【int】后,占4个字节。

总结:只有非静态成员变量才属于类的对象上。

class Person {public:        Person() {                mA = 0;        }        //非静态成员变量占对象空间        int mA;        //静态成员变量不占对象空间        static int mB;         //函数也不占对象空间,所有函数共享一个函数实例        void func() {                cout << "mA:" << this->mA << endl;        }        //静态成员函数也不占对象空间        static void sfunc() {        }};int Person::mB=0;int main() {        cout << sizeof(Person) << endl;        system("pause");        return 0;}

2 this指针概念

通过1我们知道在C++中成员变量和成员函数是分开存储的

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码

那么问题是:这一块代码是如何区分那个对象调用自己的呢?

c++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象

this指针是隐含每一个非静态成员函数内的一种指针。

this指针不需要定义,直接使用即可。

this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分

  • 在类的非静态成员函数中返回对象本身,可使用return *this

class Person{public:        Person(int age)        {                //1、当形参和成员变量同名时,可用this指针来区分                //this指针指向被调用的成员函数所属的对象                this->age = age;                //之前案例中,是:m_Age=age;【m:number】是区分成员属性与传入形参的名称有一个规范        }        //返回本体用引用的方式        Person& PersonAddPerson(Person &p)        {                this->age += p.age;                //this指向p2的指针,而*this指向的就是p2这个对象本体                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;}

3 空指针访问成员函数

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针

如果用到this指针,需要加以判断保证代码的健壮性

示例:

//空指针访问成员函数class Person {public:        void ShowClassName() {                cout << "我是Person类!" << endl;        }        void ShowPerson() {                if (this == NULL) {                        return;                }                cout << mAge << endl;                /*void ShowPerson() {                cout << mAge << endl;                }                错误原因传入的指针为null;                默认mAge前其实有一个this指针,指向当前的类的对象,如果Person * p = NULL;                说明当前指针指向的对象是一个空指针,又怎么访问对象呢!                */              }public:        int mAge;};void test01(){        Person * p = NULL;        p->ShowClassName(); //空指针,可以调用成员函数        p->ShowPerson();  //但是如果成员函数中用到了this指针,就不可以了}int main() {        test01();        system("pause");        return 0;}

4 const修饰成员函数

常函数:

  • 成员函数后加const后我们称为这个函数为常函数

  • 常函数内不可以修改成员属性

  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象:

  • 声明对象前加const称该对象为常对象

  • 常对象只能调用常函数

示例:

class Person {public:        Person() {                m_A = 0;                m_B = 0;        }        //this指针的本质是一个指针常量,指针的指向不可修改,值可以改        //如果想让指针指向的值也不可以修改,需要声明常函数        void ShowPerson() const {                //const Type* const pointer;                //this = NULL; //不能修改指针的指向 Person* const this;                //this->mA = 100; //但是this指针指向的对象的数据是可以修改的                //const修饰成员函数,表示指针指向的内存空间的数据不能修改,除了mutable修饰的变量                this->m_B = 100;        }        void MyFunc() const {                //mA = 10000;        }public:        int m_A;        mutable int m_B; //特殊变量,即使在常函数中,也可以修饰这个值,加关键字mutable};//const修饰对象  常对象void test01() {        const Person person; //常量对象          cout << person.m_A << endl;        //person.mA = 100; //常对象不能修改成员变量的值,但是可以访问        person.m_B = 100; //但是常对象可以修改mutable修饰成员变量        //常对象访问成员函数        person.MyFunc(); //常对象不能调用const的函数}int main() {        test01();        system("pause");        return 0;}

以上就是关于"C++对象模型与this指针怎么使用"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

0