类的实例化

类的实例化

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}


private:
	int _year;
	int _month;
	int _day;     //这只是函数的一个声明并没有定义
};

上面是一个类,我们可以把有花括号括起来的叫做一个域,所以我们叫可以叫上面的Date叫类域
既然是域,那我们可以用访问域的方法来访问上面的类域吗?
我们试一试:

我们输入:Date::_year;

发现编译器会报错。
在这里插入图片描述
在这里插入图片描述

这是为什么?

因为类中:只是变量的一个声明而已,并不是变量的定义。

变量的定义会开空间,而只是声明则不会开辟空间

所以我们定义一下就可以解决这个问题:

那什么时候才是定义呢?

Date d

这样就行了,对象的定义也就叫对象的实例化

这样就会开空间出来。
类的实例化_第1张图片

下面我们思考一个问题:类Date 和类实例化后的对象:d1 所占的空间是多少?

#include
using namespace std;
class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}


private:
	int _year;    //int 整型 4个字节
	int _month;
	int _day;     
};


int main()
{
	Date d1;
	d1.Init(2023, 7, 9);

	Date d2;
	
	cout << sizeof(Date) << endl;
	cout << sizeof(d1) << endl;
	return 0;
}

答案是12 还是 16 ?

类的实例化_第2张图片
你会感到疑惑,private中的三个整型加起来就是12了,还有一个函数呢?,难道函数不死存放在这个类里面的吗?

是的,为了避免空间的浪费,会把函数存在公共的代码区

判断一下,下面的类有多少个字节?

//类中既有成员函数又有函数变量
class A1 {
public:
	void f1() {}
private:
	int _a;
};

// 类中仅有成员函数
class A2 {
public:
	void f2() {}
};
// 类中什么都没有---空类
class A3
{};

sizeof 输出的结果是:

cout << sizeof(A1) << endl;

	cout << sizeof(A2) << endl;

	cout << sizeof(A3) << endl;

在这里插入图片描述

为啥,你说A1是4都还好理解,但是A2,A3是怎么回事?
之前说过成员函数不是存放在类里面的,所以A2中有个成员函数不影响。
A2 和 A3 的字节数是一样的,但是,为什么是1 不是 0 ?
A3 中啥都没有呀?
因为 这一个字节是用来占位 的。c++ 针对这种没有成员变量的类,给它分配了一个字节用来占位, 这一个字节并不是用来存储数据的,只是表示这个类存在过。

你可能感兴趣的:(c++)