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

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


文章目录

  • 成员变量和成员函数分开存储
    • ①是否属于类对象上?
    • ②空对象占用内存
  • this指针概念
    • 第一个知识点:如何解决变量重名名
    • 第二个知识点:this作为返回指向当前对象的指针
  • 复读

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

①是否属于类对象上?

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

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

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

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

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

②空对象占用内存

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

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

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

代码:

#include
#include
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()函数的运行结果为:

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

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

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

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

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

this指针概念

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

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

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

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

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

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

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

#include
#include
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;
}

运行结果如下

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

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

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

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

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

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

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

比如将代码:

#include
#include
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次。

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

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

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

复读

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

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

②链式编程思想

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

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

学吧,学无止境,太深了

你可能感兴趣的:(C++学习与回顾,c++,java,开发语言)