从“追求尽量不出错”,到正视“出错是必然”|

如此而已~~~

园龄:3年3个月粉丝:0关注:12

C++对象模型与this指针

C++对象模型与this指针:

类中的成员函数与成员属性分开储存:

通过类的对象所占用的内存空间的字节数来观察:

1、类为空时我们发现 对象所占一个字节(这是因为即使类为空,其所创建的对象之间也是需要进行区分的)

2、类不为空时:

2.1、查看类中非静态成员变量与非静态成员函数

2.2、查看类中静态成员变量与静态成员函数

最终得出:非静态成员变量属于类的对象上,其余都不属于类的对象上

参考代码:

#include <iostream>
using namespace std;
//成员变量和成员函数是分开存储的
class Person
{
int m_A; //非静态成员变量 属于类的对象上
static int m_B; //静态成员变量 不属于类的对象上
void func() {} //非静态成员函数 不属于类的对象上
static void func2() {} //静态成员函数 不属于类的对象上
};
int Person::m_B;
void test01()
{
Person P;
//空的对象占用的内存空间为:1
//C++编译器会给每一个空对象也分配一个字节空间,是为了区分空对象占内存的位置
//每个空对象也应该有一个独一无二的内存地址
cout << "size of P=" << sizeof(P) << endl;
}
void test02()
{
Person P2;
cout << "size of P2=" << sizeof(P2) << endl;
}
int main()
{
//test01(); 测试类为空时所占用的内存空间
test02();
system("pause");
return 0;
}

this指针:

可以认为this指针是系统自动生成的对象指针变量,关键在于是哪一个对象在调用类中成员函数,此时this就指向这一个对象。

通过上述描述我们了解到了在C++中成员变量和成员函数是分开的

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

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

概念:

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

以此区分调用类中成员函数的对象是哪一个

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

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


用途:

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

参考代码:

#include <iostream>
using namespace std;
//C++通过提供特殊的对象指针
//this指针,解决多个对象调用类中的成员函数时区分是哪一个对象在调用的问题
//this指针指向被调用的成员函数所属的对象
//this指针是隐含每一个非静态成员函数内的一种指针
//this指针不需要定义,直接使用即可
//this指针的用途:
//当形参和成员变量同名时,可以用this指针来区分
//在类的非静态成员函数中返回对象本身,可以使用 return *this
class Person
{
public:
Person(int age)//注意此处自己写了一个有参构造函数 编译器便不会提供默认构造函数所以创建对象会出问题
{
//this指针指向 被调用函数的成员函数所属的对象
this->age = age; //没有加this->时 此处编译器认为这三个age是同一个 (认为是形参 而非成员变量)
//这也是前面成员变量前面加了一个M_的原因(member)
//加了this之后便没有问题了
}
//此时返回值如果是Person类 那么就会调用拷贝函数 每次调用就会产生一个新的对象(参考拷贝函数的调用时机)
//而引用返回不会创建一个新的对象
Person& Person_ADDAge(Person &p)//返回值为引用函数调用可以为左值
{
this->age += p.age;
return *this; //此处当P2调用这个函数时this指针就指向P2
}
int age;
};
//1、解决名称冲突
void test01()
{
Person P1(18); //调用有参构造函数
cout << "p1的年龄为:" << P1.age << endl;
}
//2、返回对象本身用*this
void test02()
{
Person P1(10);
Person P2(10);
//链式编程思想:比如已经了解过的有:cout的 左移位运算符追加
P2.Person_ADDAge(P1).Person_ADDAge(P1).Person_ADDAge(P1); //此处如果想要追加这个函数调用?
cout << "P2的年龄为:" << P2.age << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}

本文作者:如此而已~~~

本文链接:https://www.cnblogs.com/fragmentary/p/16396495.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   如此而已~~~  阅读(23)  评论(0编辑  收藏  举报
//雪花飘落效果
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起