类和对象1
前言
在c语言中没有类,但是有结构体结构体中只能定义变量,不能定义函数但是在c++中,结构体多了可以定义函数的能力,并且c++中多了一个限定符的概念即结构体的成员是有访问权限的:public,protected,private,再没有特别声明的情况下,结构体的成员默认为public,并且在使用结构体时候,在定义结构体变量时也不需要再加上一个struct的关键字了。但是c++中习惯用class,因为c++中class几乎和结构体一样,只是class的成员默认的访问权限是private.
限定符
访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
看代码:类A中有一个int类型的私有成员变量,dat。
A a(1);
int *p = a.getaddr();//得到a中dat的地址
cout<<a.getvalue()<<endl;
*p=2;
cout<<a.getvalue()<<endl;//到到a中dat的值
return 0;
代码的结果是输出:
1
2
可以证实,限定符只是语法上的问题,即编译时会检查有一些访问是否合法,但是我们依然通过地址在类外直接访问或者修改私有变量。
引用>
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- class的默认访问权限为private,struct为public(因为struct要兼容C)
c++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式是private。
封装的理解
面向对象的三大特性:封装,继承,多态
封装:将数据和操作数据的方法有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
兵马俑的例子:
管理兵马俑,不能大家随便看呀,这样兵马俑就可能被破坏了,我们首先得建房子保护起来,然后设置一个接口访问,其实就是售票口,并且访问时候也要遵守制定好的规则,合理的看兵马俑,要隔着一个玻璃墙。
操作系统中的例子:
操作系统的中系统调用实际上就是封装好的,为什么封装呢,因为首先需要保护内核中的数据,如果我们直接操作内核中数据是不安全的,我们可能有些细节注意不到,导致不合理的操作,系统调用就把实现细节做好,并且不会导致对系统的不安全,这就是封装的意义。
类的作用域
作用域解析符 ‘::’
这个其实和名字空间又扯上关系了
可以定义名字空间来防止变量重名导致的问题
如果要体现C++代码风格,作用域算一个
类的实例化
说到类,当我们定义一个类之后比如在main函数的前面写上一段代码
class A
{
…
};
注意:上面的代码只是一个声明,告诉操作系统有这个类,并且给了操作系统一张图纸,就和建房子先要一张房子的图纸一样。类的实例化叫做这个类的对象,对象是根据类这个图纸创建出来了,这张图纸可以创建多个对象同样的可以用一张房子的图纸造出许多一样的房子。
计算类对象的大小
在没有虚函数的前提下
实际上,一个类的大小,实际就是该类"成员变量"之和,当然也要进行内存对齐,注意空类的代销,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。
引用>
结构体内存对齐规则
- 第一个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8,gcc中的对齐数为4- 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是
所有最大对齐数(含嵌套结构体的对齐数)的整数倍
结构体为什么要进行对齐
1.提高访问效率
2.和硬件相关,cpu每次读取的内存都是整数倍,如果内存不对齐就可能读一个数据要读两次的情况
如何让结构体按照指定的对齐参数进行对齐
#pragma pack(1)
设置默认对齐数为1
如何知道结构体中某个成员相对于结构体起始位置的偏移量
地址相减即可
&a.dat-&a
什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景
测试方法
联合结构体法
指针法
场景:
比如说代码的移植
this指针
C++中通过引入this指针解决该问题,即:C++编译器给每个“成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
指针的特性
- this指针的类型:类类型* const
- 只能在“成员函数”的内部使用
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
- this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要户
传递
this指针存在哪里
当然是成员函数里面咯
this指针可以为空吗
当然可以,如果一个函数不需要开辟堆栈空间,是可以直接通过类名调用的。
推荐阅读
-
基于 Python 和 Pandas 的数据分析(1)
-
php日期格式 php实现常见图片格式的水印和缩略图制作面向对象
-
iQOOZ1x和荣耀Play4哪个值得买?iQOOZ1x对比荣耀Play4评测
-
做一个不复制粘贴的程序员[1]: 使用模板方法模式(2)- 对象更新比较器实例
-
关于SqlDependency类的使用和应用场景介绍
-
采用封装及反射原理封装一个将对象装换为对数据库操作的工具类
-
ThinkPHP中__initialize()和类的构造函数__construct()用法分析,thinkphp构造函数
-
Springboot mybatis generate 自动生成实体类和Mapper
-
JavaSE的包装类,自动装箱和自动拆箱 ,字符窜转换,toString(),equals(), hashCode()的区别
-
PHP新手用的Insert和Update语句构造类