C++this指针

C++只有非静态成员变量才属于类的对象上

在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上

首先看一下空对象占多少空间

class Foo {

};

int main() {
    Foo foo;
    cout << "size of is : " << sizeof(foo) << endl;
}

结果为 size of p = 1;

说明空对象占用内存空间为:1

为什么是1呢?

因为C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置。
每个空对象也应该有一个独一无二的内存地址,因此编译器会给每个空对象分配一个字节作为区分。

再来看看给空对象中添加一个非静态变量

class Foo {
public:
    int m_number_1;
};

int main() {
    Foo foo;
    cout << "size of is : " << sizeof(foo) << endl;
}

结果为 size of p = 4;

说明:非静态变量m_number_1属于类的对象上

再给Foo中添加一个静态变量

class Foo {
public:
    int m_number_1;
    static int number_2;
};
int person::number_2 = 10;//static变量是在类内申明,在类外初始化的,
//并且在类外初始化的时候要加上它的作用域

int main() {
    Foo foo;
    cout << "size of is : " << sizeof(foo) << endl;
}

结果为 size of p = 4;

说明:静态变量m_number_2不属于类的对象上

最后我们再往类中添加一个非静态函数和一个静态函数

class Foo {
public:
    int m_number_1;
    static int number_2;

public:
    void Func01();
    static void Func02();
};
int person::number_2 = 10;//static变量是在类内申明,在类外初始化的,
//并且在类外初始化的时候要加上它的作用域

int main() {
    Foo foo;
    cout << "size of is : " << sizeof(foo) << endl;
}

结果都仍然为:size of p = 4;

说明:成员函数(包括静态和非静态)不属于类的对象上

综上所述:

  • 成员函数(包括静态和非静态)与成员变量分开存储
  • 只有非静态的成员变量的内存是在该类内的,其余都不在

一个思考

从上面的结论可以引发一个思考,非静态成员函数是不属于类对象的,非静态成员函数是单独存储在一个空间中的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。

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

this指针

一、this指针的定义和用法

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

this指针是隐含每一个非静态成员函数内的一种指针,this指针不需要定义,直接使用即可。

this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分
  • 在类的非静态成员函数中返回对象本身,可使用return *this
class Foo {
public:
    int m_num;

public:
	PFoo(int m_num){
		//1、当形参和成员变量同名时,可用this指针来区分
		this->m_num = m_num;
	}
 
	Foo& FooAddFoo(Foo f){
		this->m_num += f.m_num;
		//2、返回对象本身
		return *this;
	}
	
};
 
int main() {
	Foo f1(20);
	cout << "f1.m_num =  " << f1.m_num << endl;
 
	Foo f2(10);
	f2.FooAddFoo(f1).FooAddFoo(f1);	  // 等价于:(f2.FooAddFoo(f1)).FooAddFoo(f1);
                                      // 10 + 20 + 20
	cout << "f2.m_num = " << f2.m_num << endl;

	return 0;
}

二、this指针的本质--指针常量

this指针的本质是一个指针常量:const Type* const pointer;

他储存了调用他的对象的地址,并且不可被修改。这样成员函数才知道自己修改的成员变量是哪个对象的。

例如:调用date.SetMonth(9) <===> SetMonth(&date, 9),this指针帮助完成了这一转换,使得this指针指向了调用对象data。

三、this指针的特点

1.只能在成员函数中使用,在全局函数、静态成员函数中都不能使用 this(this始终指向当前对象,静态成员函数属于类)

  1. this 指针是在成员函数的开始前构造,并在成员函数的结束后清除(和函数的其他参数生命周期一样)

  2. this 指针会因编译器不同而有不同的存储位置,可能是栈、寄存器或全局变量 (编译器在生成程序时加入了获取对象首地址的相关代码并把获取的首地址存放在了寄存器中)

  3. 关于this指针的一个经典回答:

当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子的全貌 ,你看不到了

  
对于一个对象(也就是类的实例)来说,你可以看到它的成员函数、成员变量,但是看不到对象本身了

所以有了this指针,它时时刻刻指向你这个对象本身

posted @ 2023-04-03 19:45  Bdathe  阅读(32)  评论(0)    收藏  举报