【C++第二阶段】分开存储成员变量与成员函数&this指针概念

文章详细解释了C++中成员变量和成员函数的存储位置,区分了静态与非静态的区别,探讨了空对象占用内存的情况,以及this指针在解决变量重名和作为返回指向当前对象指针的应用。还介绍了链式编程思想的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你好你好!
以下内容仅为当前认识,可能有不足之处,欢迎讨论!


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

①是否属于类对象上?

意为在内存空间中是否在类起始的位置并紧挨着。

非静态成员变量——属于类对象上;

静态成员变量——不属于;

非静态成员函数——不属于;

静态成员函数——不属于。

②空对象占用内存

空对象占用内存为1,若对象中存在成员变量,则按照成员变量大小来划分。

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

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

代码:

#include<iostream>
#include<string>
using namespace std;

class Empty{
    
};

class Person{
    int person_age;
    public:
    static string person_name;
    void test_01(){
        cout<<"person 类 test_01测试案例。"<<endl;
    }
    void test_02(){
        cout<<"person 类 test_02测试案例。"<<endl;
    }
};

static string person_name = "张三";

void test_020510_0(){
    Empty empty;
    cout<<"Empty类的大小为:"<<sizeof(empty)<<"."<<endl;
}

void test_020510_1(){
    Person person;
    cout<<"Person 类的单独对象大小为:"<<sizeof(person)<<"."<<endl;
}

int main(){
    test_020510_0();
    test_020510_1();
    
    system("pause");
    return 0;
    
}

test_020510_0()函数的运行结果为:

image-20240205223858712

说明空类为了占位置(暂时当作这个原因),而内存设置为1。

test_020510_1()函数的运行结果为:

image-20240205224002130

说明只有非静态成员对象成员变量和类对象是一体的,占内存大小为4字节,静态成员变量,静态成员函数或非静态成员函数都没有和类对象的位置绑定到一块。

this指针概念

C++中成员属性和成员函数是分开存储的。

每一个非静态成员函数只会诞生一份函数实例==多个同类型的对象会公用一块代码。

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

this指针不需要定义,直接使用就行。

第一句话通过成员属性和成员函数分开存储已经证明,第二句话意为普通的成员函数,多个同类型的对象都会用。(但这不是应该的吗?)

this指针需要掌握:①this指针的用途之——解决变量重命名的问题。②this指针可以作为返回值,返回被调用成员函数的对象本身。

第一个知识点:如何解决变量重名名

#include<iostream>
#include<string>
using namespace std;
class Person{
    public :
    int age;
    Person(int age){
        cout<<"Person 的类构造函数正在调用。"<<endl;
        age = age;//这里就显示3个age是同一个age,加上指针后说明age只是类对象里面的。
        //this->age = age;
        cout<<"Person 的变量值为:"<<Person::age<<"。"<<endl;
    }
};

void test_020511_0(){
    Person person(30);
    
}

int main(){
    test_020511_0();
    sytem("pause");
    return 0;
}

运行结果如下

image-20240205231554225

可以看到,变量名重复了,对应变量值就没法传进来。

加上this指针后(9行注释,10行取消注释),运行结果如下:

image-20240205231417114

可以看到,加上this指针后确实可以避免变量命名重复问题。

第二个知识点:this作为返回指向当前对象的指针

this指针还有一个用处:可以返回当前所对应对象的指针。

比如将代码:

#include<iostream>
#include<string>
using namespace std;

class Person {
public:
	int age;
	Person(int age) {
		cout << "Person 的类构造函数正在调用。" << endl;
		age = age;//这里就显示3个age是同一个age,加上指针后说明age只是类对象里面的。
		this->age = age;
		cout << "Person 的变量值为:" << Person::age << "。" << endl;
	}
	Person& add_age(Person &person) {
        this->age += person.age;
       	return *this;//这里为什么用解引用?
        //this指向对象的指针,加※代表指向的是对象本体
	}
};

void test_020511_0() {
	Person person(50);
	person.add_age(person).add_age(person).add_age(person);
	cout<<"person age += 3次后,age = "<<person.age<<"."<<endl;
}
int main(){
    test_020511_0();
    
    system("pause");
    return 0;
}

运行结果如下,可以看到当返回值为this指针所指向的对象时,多次add_age(Person person)函数后,将每次的返回对象作为引用传回去,最后的年龄从左向右加了3次。

image-20240205232658802

但是如果传入的参数,返回值为值,那就只是在内存空间中拷贝了一份对象加减,调用完函数之后又自动销毁,导致有两次的add_age()函数对想要的效果相当于没用。

image-20240205232815883

复读

①this指向对象的指针,加※代表指向的是对象本体。

Person& add_age(Person &person) {
        this->age += person.age;
       	return *this;//这里为什么用解引用?
        //this指向对象的指针,加※代表指向的是对象本体
	}

②链式编程思想

person.add_age(person).add_age(person).add_age(person);

以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘义申汉

随缘惜缘不攀缘。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值