🧸🧸🧸 各位大佬大家好,我是猪皮兄弟🧸🧸🧸
今天带来的内容是类和对象(上)
这里是下面要讲的知识内容🥳🥳🥳
文章目录
一、类的引入
C++兼容C语言,所以还保留了struct语法,,同时将struct升级成了类,虽然可以用struct,但是更多的,还是用class
struct默认是public的
class默认是private的
类的定义如下:
class className//struct或者class
{
//成员函数与成员变量
}
二、类的访问限定符
首先,访问限定符是限制类外的东西来访问类里面的成员
三种访问限定符:
public共有
protected保护
private私有
1.public的成员可以在类外直接被访问
2.protected和private的成员在类外不能被直接访问,在这里是没有区别的(在后面继承的时候才有区别)
3.访问限定符的作用域是从访问限定符出现的位置到下一个访问限定符出现的位置。
4.class的默认访问权限为private,struct的默认访问权限为public(为兼容C)
注意:访问限定符只在编译的时候有用,当数据映射到内存后,没有任何访问限定符上的区别
三、类的两种定义方式
1.声明和定义全在类中
声明和定义全部放在类体中,需要注意:成员函数如果在类中定义(默认把所有成员函数都加了inline),编译器可能会将其当成内联函数处理(符合inline的条件)
2.声明和定义分开
声明放在.h文件中,类的定义放在.cpp文件中,声明和定义分开就不是内联(函数在类中定义才默认是内联)
1.小函数:如果想称为内联,直接在类里定义即可
2.大函数:应该声明和定义分离(方便看整体情况)
四、封装(利用访问限定符)
面向对象三大特定:封装,继承,多态
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。用private和protected去隐藏一些细节,对外公开的就定义成public
比如,不能cout<< st.a[i]<<endl去访问栈顶的元素,只能够调用接口st.Top();去获得栈顶元素。因为你不清楚我的底层实现,所以用第一种访问的时候,i的取值不正确就会访问出错
C不封装和C++封装的区别:
C语言没办法封装,规范使用函数访问数据,也可以不规范直接访问数据,会出错
C++封装,不能直接访问数据,只能规范的使用函数去访问数据,不会出错
五、类的实例化
类的实例化也就是用类去创建一个对象
也就相当于用图纸去修房子
特别注意,放在类里面的成员变量都是声明,可能有些地方能看到它后面带了值,但那个值是一个缺省值,用来定义的时候初始化用的
六、全局变量和静态变量在.h中定义的问题
1.全局变量
全局变量的链接属性是所有文件可见,如果在.h文件中定义,会在.cpp中展开,因为是所有文件可见,所以展开的是同一个(地址相同),在链接的时候,多个.obj文件通过连接器链接,这时候会发生符号表的重定位,因为有多个相同的全局变量,所以会发生符号重定义问题
2.静态变量
静态变量的链接属性是当前文件可见,也就是说在.h问及爱你中定义,会在.cpp中展开,但是,展开的是重新生成的静态变量,因为原来的那个静态变量在该文件中不可见,所以在链接的时候,符号表重定位时是不同的几个静态变量,也就不会出现符号重定义问题;
七、类对象模型
类的大小是如何进行计算的???
1.对象存储方式设计一
将所有的成员都存到里面去
1.浪费空间
2.不是同一个函数(地址不同)
2.对象存储方式设计二
指针数组存储成员函数,这样的话没每个对象都可以通过指针去找到成员函数,不需要存储多份。但也不够好
3.对象存储方式设计三
只保存成员变量,把成员函数放在一个公共的区域—>代码段
编译链接的时候就根据函数名去代码段找到函数地址,再call函数地址
对于这段代码,设计一二两种方式都会报错,因为需要去解引用,但是设计三就不会,因为调用这个函数是去公共的代码段找的,所以并不会去解引用
虽然非静态成员函数是放在代码段的,是公共区域,但是也要看谁去调用,静态成员函数就不能够调用,因为静态成员函数没有this指针,无法调用类的对象的非静态成员数
八、类的内存对齐
因为类的实例的成员函数不在结构里面,所以只需要计算成员变量的内存对齐即可,与结构体内存对齐相似,这里我就放一篇结构体内存对齐的博客。
【自定义类型】结构体(结构体内存对齐)、枚举、联合—猪皮兄弟
另外,需要注意:
空类的大小都是1因为如果一个字节的地址都不开的话,定义了一个对象,它的地址怎么取??
这一个字节的作用就是用来占位,不存储实际数据,标识对象存在
九、this指针
this指针是C++调用的精华
const写在*前面,修饰的是指针指向的内容
const写在*后面,修饰的是指针本身
十、总结
上面对C++类和对象(上)中的重要知识点进行了总结,感谢大家的支持,后面我会继续更新类和对象有关方面的内容!