C++——类和对象

1.类的引入

c语言有结构体的概念,结构体中可以包含多个成员变量它封装了一个变量的各种属性。
c++中也有结构体,与c语言不同的是它不仅包含成员变量还有成员函数。

2.类的定义

c++中的类可以用struct定义,多数情况下用class来定义。

class student
{
	//成员
	//成员变量
	int _name;
	int _age;
	int _score;
	
	//成员函数的定义
	void PrintScore()
	{
		printf("%d\n", _score);
	}
};

类中可以直接定义成员函数,也可以只有成员函数的声明,定义就放在别的地方了,比如下面这样。

class student::PrintScore()   //如果是在函数外面定义函数就要用 stdent:: (类名+域作用限定符)来访问类当中的成员
{
	printf("%d\n", _score);
}

class student
{
	//成员
	//成员变量
	int _name;
	int _age;
	int _score;

	//成员函数
	void PrintScore();

};

3.类的访问限定符

类的访问限定符有三种:
1.public 公有
2.private私有
3.protect保护
说明:
1.类内部用public修饰的成员,可以被外部直接访问,用private和protect修饰的成员不能被直接访问。
2.访问权限的作用域从该限定符只开始到下一个限定符位置结束
3.class内成员不用限定符修饰默认是成员是private,struct内成员不用限定符修饰默认是public(为了兼容c语言,所有成员均可被外部访问)

class Date
{
	//一般来说成员函数是公有的允许外部调用该函数
public:
	void Set(int year = 1900, int month = 1, int day = 1);

	//一般来说,成员变量会设置成是私有的不允许直接访问
private:
	int _year;
	int _month;
	int _day;
};

4.类的实例化(对象)

用类定义出来的变量就是对象。这个过程就是类的实例化。

	Date d1; //用类名定义出来的变量 d1 就是对象
	Date d2; //一个类可以实例化处多个对象。

5.类的大小(结构体内存对齐)

类当中的成员变量保存在类当中,在定义变量时开辟空间存放变量;而类当中的函数并没有保存在类当中,而是保存在公共的代码段。当指令执行到这块时,会直接根据函数名从代码段去找。所以类当中只有成员变量占空间,且同样满足内存对齐规则。
需要注意的是空类的大小为1个字节,这一个字节不存储有效数据,仅仅只是说明这个类存在,起到‘占位’的作用。
结构体内存对齐规则:
1.第一个变量在结构体偏移量为0的位置,后续的变量的地址是对齐数的整数倍。对齐数变量自身大小和编译器默认对齐数的较小值。
引申出几个问题:
1.为什么要有内存对齐?
主要是用空间换时间,提高cpu取数据的效率。cpu每次都是取2,4,8,16字节大小的内存的数据,如果变量都内存对齐就只用访问一次内存就可以取到该数据,否则就要访问两次内存。举个例子:cpu每次只能取4个字节的数据,如果一个int型变量的首地址在地址为3的位置处,那cpu不是直接从地址3处连续读取4个字节送入寄存器,而是先从地址0读取4个字节(0-3)送入寄存器中,再从地址4读取4个字节(4-7)送入寄存器中,然后从这两个寄存器中只提取出(3-6)字节的数据。这样才把一个变量送到了寄存器当中,效率十分低下。
2.如何让结构体按指定参数对齐?
#pragma pack(n)

6.隐含的this指针

我们知道类的成员函数不是保存在类当中,而是和正常的函数一样都是保存在代码段,和正常的调用函数一样,去代码段寻找,那编译器是如何知道调用的是哪个类的成员函数。

	Date d1; 
	Date d2; 

	d1.Set(2000, 1, 1);//这里的 d1. 不是去访问 d1 类中的函数(因为类中就没有保存函数),而是访问 set 函数,只是用到了 d1 的成员变量 
	d2.Set(2000, 2, 2);

那C++ 在这里其实是有个隐含的 this 指针。
在这里插入图片描述
定义函数时的 this 指针,以及调用函数时的 &d1 都是不用程序员写的,编译器在编译的时候都会自己加上。
this指针是函数形参依然保存在栈中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值