C++类与对象2

目录

1.类的对象大小的计算

2.类成员函数的this指针

本篇讲述以上类容

类的对象大小计算

在C语言中,结构体中的成员变量,满足内存对齐原则,具体内存对齐原则,在我之前讲的C语言结构体中有详细说明,这里就不多说了内存对齐原则
那么,C++中的类,也满足内存对齐原则,比如:

class person
{
	int _a;
	char _b;
	double _c;
};
int main()
{
	person _A;
	cout<<sizeof(_A)<<endl;
}

运行结果如下,这里默认对齐数为8。
在这里插入图片描述
不难看出,与struct中对齐规则是一致的。那么如果类中嵌套定义一个类呢?比如:

class person
{
public:
	int _a;
	char _b;
	double _c;
	class _number
	{
		int _e;
		char _f;
		double _h;
	};
};
int main()
{
	person _A;
	cout<<sizeof(_A)<<endl;;
}

这里,就是需要注意的,结果仍然为16
在这里插入图片描述
这是因为我们在person这个类中。没有定义_number这个类的变量,所以,编译器是不会计算_number这个类中的变量大小,但如果改成下面形式

class person
{
public:
	int _a;
	char _b;
	double _c;
	class _number
	{
		int _e;
		char _f;
		double _h;
	};
	_number _B;//定义_number类类型的一个变量
};
int main()
{
	person _A;
	cout<<sizeof(_A)<<endl;;
}

结果显而易见为32
在这里插入图片描述
我们再看以下例子:

#include<iostream>
using namespace std;
class A1//含有成员变量和成员函数
{
public:
	int _a;
	void fun()
	{};
};
class A2//只含有成员函数
{
	void fun()
	{};
};
class A3//空类
{};
int main()
{
	cout<<sizeof(A1)<<endl;
	cout<<sizeof(A2)<<endl;
	cout<<sizeof(A3)<<endl;
}

输出结果如下:
在这里插入图片描述
至此我们得出结论:
1.类满足内存对齐原则。
2.嵌套类本身也遵循内存对齐的原则
3.类中只保存成员变量,成员函数存放在公共的代码段(成员函数不占字节数)
4.空类较特殊,编译器给了空类一个字节来唯一标识这个类

类成员函数的this指针

我们先看下面这个类的定义

class A1
{
public:
	void set(int a = 1,double b = 0.1)
	{
		_a = a;
		_b = b;
	}
	void display()
	{
		cout<<_a<<" "<<_b<<endl;
	}
private:
	int _a;
	double _b;
};
int main()
{
	A1 A,B;
	A.set(10,10.5);
	B.set(15,15.5);
	A.display();
	B.display();
}

我们在main函数中定了两个对象A,B。A1这个类中的两个成员函数并没有关于不同对象的区分,那么当A调用set的时候,set函数是如何知道设置A这个对象,而不设置B这个对象的呢?
这就有了this指针的引入:
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
上述display()就等价于:

	void display()
	{
		cout<<this->_a<<" "<<this->_b<<endl;
	}

其中this指向的就是当前调用display函数的对象的地址,作为成员函数的形参。
这里为大家总结一下this指针的特性:

  1. this指针类型为const* 类型
  2. this指针只能在成员函数内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针
  4. this指针是成员函数所隐藏的第一个指针形参
  5. this指针是通过编译器传递,不需要显式定义它
  6. this不是类的成员,只是一个函数形参
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读