c++中类的定义和使用规则

目录

 

类的定义

类的访问限定符

c++中类的访问限定符有三种

类的作用域

类的实例化

类的大小


类的定义

类的定义:

class classname	//class为声明类的关键字,classname为类的名称
{
	//创建类的成员
};

在类中创建的变量为成员变量,在类中创建的函数为成员函数

在类中定义的成员函数默认是inline类型的,但是如果程序太长也不会进行展开了

在类外定义的成员函数不会展开

 

类中函数的两种定义方式

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<iostream>
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,当我们计算类的时候,只计算成员变量的大小,不计算成员函数

类的计算也遵循结构体内存对齐的原则

 

为什么不计算成员函数的大小呢?

b9af8bc4b627439886ca7c3c2960adf7.png

当我们定义一个类时,成员变量可能会被我们放不同的值,但是成员函数都是一样的,假如我们每次实例化一个对象的时候都创建一次成员函数,相当于重复创建了多个成员函数,造成了空间上的浪费

所以我们将成员函数放在公共代码段,让所有实例化出的对象用这一个函数,这样可以大大节约空间上的成本

 

接下来我们来看一个特殊的情况

空类的大小:

#include<iostream>
using namespace std;

class A
{

};

int main()
{
	A a;
	cout << sizeof(a);
	return 0;
}

运行的结果为1
空类虽然里面什么成员也没有,但为了说明这个类时存在的,系统给了它一个占位符来说明了这个类的存在,所以占用了1字节的空间

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起慢慢变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值