四.sizeof用于类(C++)

内容参考于《21天学通C++》(第八版)
不去纠结C++的原理和细节,从C的角度去学习C++,再通过C++项目去加深理解

四.sizeof用于类

1. 示例-只算成员变量大小,不算方法
#include <iostream>
#include <string.h>
using namespace std;
class MyString
{
private:
	char* buffer;
public:
	MyString(const char* initString) // default constructor
	{
		buffer = NULL;
		if (initString != NULL)
		{
			buffer = new char[strlen(initString) + 1];
			strcpy(buffer, initString);
		}
	}

	MyString(const MyString& copySource) // copy constructor
	{
		buffer = NULL;
		if (copySource.buffer != NULL)
		{
			buffer = new char[strlen(copySource.buffer) + 1];
			strcpy(buffer, copySource.buffer);
		}
	}

	~MyString()
	{
		delete[] buffer;
	}

	int GetLength()
	{
		return strlen(buffer);
	}

	const char* GetString()
	{
		return buffer;
	}
};

class Human
{
private:
	int age;
	bool gender;
	MyString name;

public:
	Human(const MyString& InputName, int InputAge, bool gender)
		: name(InputName), age(InputAge), gender(gender) {}

	int GetAge()
	{
		return age;
	}
};

int main()
{
	MyString mansName("Adam");
	MyString womansName("Eve");

	cout << "sizeof(MyString) = " << sizeof(MyString) << endl;
	cout << "sizeof(mansName) = " << sizeof(mansName) << endl;
	cout << "sizeof(womansName) = " << sizeof(womansName) << endl;

	Human firstMan(mansName, 25, true);
	Human firstWoman(womansName, 18, false);

	cout << "sizeof(Human) = " << sizeof(Human) << endl;
	cout << "sizeof(firstMan) = " << sizeof(firstMan) << endl;
	cout << "sizeof(firstWoman) = " << sizeof(firstWoman) << endl;

	return 0;
}

32位编译器输出

sizeof(MyString) = 4
sizeof(mansName) = 4
sizeof(womansName) = 4
sizeof(Human) = 12
sizeof(firstMan) = 12
sizeof(firstWoman) = 12

64未编译器输出

sizeof(MyString) = 8
sizeof(mansName) = 8
sizeof(womansName) = 8
sizeof(Human) = 16
sizeof(firstMan) = 16
sizeof(firstWoman) = 16

从中可知,将 sizeof( )用于类及其对象时,结果相同。 sizeof(MyString)和sizeof(mansName)的值相同,因为类占用的字节数在编译阶段就已确定。虽然 mansName 包含 Adam,而 womanName 包含 Eve,但它们占用的字节数相同,这没什么可奇怪的,因为存储姓名的MyString::buffer 是一个 char *,这是一个大小固定的指针(在我使用的 32 位系统中,为 4 字节),而与指向的数据量无关。将 sizeof( )用于 Human 时,结果为 12。第 44~46 行表明, Human 包含一个 int 成员、一个 bool成员和一个 MyString 成员。要获悉内置类型占用的字节数,请参阅程序清单 3.4。从该程序清单可知,int 占用 4 字节, bool 占用 1 字节,而 MyString 占用 4 字节。它们的总和与输出中的 12 字节不符,这是因为 sizeof( )的结果受字填充( word padding)和其他因素的影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值