类的实例化
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
这样就行了,对象的定义也就叫对象的实例化
这样就会开空间出来。
下面我们思考一个问题:类Date
和类实例化后的对象:d1
所占的空间是多少?
#include<iostream>
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
?
你会感到疑惑,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++ 针对这种没有成员变量的类,给它分配了一个字节用来占位
, 这一个字节并不是用来存储数据的,只是表示这个类存在过。