目录
类的定义
类的访问限定符
c++中类的访问限定符有三种
类的作用域
类的实例化
类的大小
类的定义
类的定义:
class classname //class为声明类的关键字,classname为类的名称
{
//创建类的成员
};
在类中创建的变量为成员变量,在类中创建的函数为成员函数
类中函数的两种定义方式
1、在类中定义
class classname
{
public:
void init() //在类中定义函数
{
_x = 1;
}
private:
int _x;
};
2、在类中声明函数,在类外定义函数,将类定义在.h文件,函数定义在.c文件中
class classname
{
public:
void init();
private:
int _x;
};
void classname::init() //在类外定义函数,要用作用域限定符指定这个函数在哪个类中
{
_x = 1;
}
类的访问限定符
c++中类的访问限定符有三种
public,private,protect
类的作用域1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. class的默认访问权限为private,struct为public(因为struct要兼容C)
5、访问限定符只是限制类外对类中成员的访问,在类中可以随意访问
class data //创建一个类相当于创建了一个类域,所有的成员都在这个域中
{
public:
void init();
private:
int _year;
int _month;
int _day;
};
void data::init() //当我们函数声明和定义分离的时候,要指明这个函数在哪个类中,需要用到::作用域限定符
{
_year = 2022;
_month = 4;
_day = 12;
}
类的实例化
class Data //创建一个类相当于创建了一个类域,所有的成员都在这个域中
{
public:
void init();
private:
int _year;
int _month;
int _day;
};
void Data::init() //当我们函数声明和定义分离的时候,要指明这个函数在哪个类中,需要用到::作用域解析符
{
_year = 2022; //成员变量的声明,没有定义,所以没有分配空间
_month = 4;
_day = 12;
}
int main()
{
Data d; //将类实例化,这个时候才分配了空间存储这个类中的成员变量
return 0;
}
1、一个类只限定了类中有什么样的成员,并没有开辟空间2、一个类可以实例化多个对象,实例化的对象开辟了空间 类的大小
#include
using namespace std;
class Data //创建一个类相当于创建了一个类域,所有的成员都在这个域中
{
public:
void init();
private:
int _year;
int _month;
int _day;
};
void Data::init() //当我们函数声明和定义分离的时候,要指明这个函数在哪个类中,需要用到::作用域解析符
{
_year = 2022;
_month = 4;
_day = 12;
}
int main()
{
Data d;
cout << sizeof(d);
return 0;
}
结果为12,当我们计算类的时候,只计算成员变量的大小,不计算成员函数
类的计算也遵循结构体内存对齐的原则
为什么不计算成员函数的大小呢?
当我们定义一个类时,成员变量可能会被我们放不同的值,但是成员函数都是一样的,假如我们每次实例化一个对象的时候都创建一次成员函数,相当于重复创建了多个成员函数,造成了空间上的浪费
所以我们将成员函数放在公共代码段,让所有实例化出的对象用这一个函数,这样可以大大节约空间上的成本
接下来我们来看一个特殊的情况
空类的大小:
#include
using namespace std;
class A
{
};
int main()
{
A a;
cout << sizeof(a);
return 0;
}
运行的结果为1
空类虽然里面什么成员也没有,但为了说明这个类时存在的,系统给了它一个占位符来说明了这个类的存在,所以占用了1字节的空间
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)