【小梦C嘎嘎——启航篇】类和对象(上篇)😎
- 前言🙌
- 什么是面向过程?什么是面向对象?
- 什么是类和对象
- 类中的访问权限属性
- 类的大小计算
- this 指针
- 构造函数
- 析构函数
- 总结撒花💞
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!
😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
前言🙌
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,分享有关** C++ 类和对象(上篇)的相关知识 **~ 都是精华内容,可不要错过哟!!!😍😍😍
什么是面向过程?什么是面向对象?
这里用一个点餐的实例来解释一下这两个概念。
简单来说,就是使用一个一个相互关联的函数来实现一些具体功能步骤的,则为面向过程;如果是通过调用一个个相互关联的类来实现的,则为面向对象。
什么是类和对象
- 类好比是一张建筑图纸,可以实例化多个相互独立的对象。在每一个建筑里面,可以有公共区域厨房客厅,也可以有私人区域,个人卧室。
对象其实就是类的实例化。在C++中,struct和class都是可以表示类的。他们的一个显著的区别是:在struct 类体中,指定的默认权限是public(公有),而class默认是private (私有)。这样,使用class会更加安全一点。
类中的访问权限属性
-
public (公有)
-
private (私有)
-
protective(保护)
如果设置的权限是private 和 protective ,则类外不能直接调用里面的成员函数或者成员变量。如果是public,则可以直接调用。在类内定义的成员函数,会将它是作为内联函数对待。
-
类是不开辟空间的,当实例化后,才会进行分配空间操作。
这里函数不在对象里面,而在一个公共的代码区里面。d1.Init(2023, 7, 19);d1.Print() 和 d2.Init(2023, 7, 19)、d2.Print(); 都是调用同一个Print 和 Init函数。
// 实例化
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
//private:
int _year; // 声明
int _month;
int _day;
};
int main()
{
// 定义开空间
Date d1;
d1.Init(2023, 7, 19);
d1.Print();
d1._year;
Date d2;
d2.Init(2023, 7, 19);
d2.Print();
d2._year;
cout << sizeof(Date) << endl;//12
cout << sizeof(d1) << endl;//12
//这里函数不在对象里面,而在一个公共的代码区里面。d1.Init(2023, 7, 19);d1.Print() 和 d2.Init(2023, 7, 19)、d2.Print(); 都是调用同一个Print 和 Init函数。
return 0;
}
类的大小计算
-
类中既有变量也有函数
-
类中仅有成员函数
-
类中什么都没有空类
成员函数不存储在类中,而是存储在公共的代码区。对于只有成员函数的类和空类,是会开辟空间的,通常是开一个字节(byte)空间,不存储数据,只是进行占位,表示对象存在。
-
在计算内存时,会遵守内存对齐的规则,成员函数是不存在对象里面的,而是位于代码区中。
-
结构体怎么对齐?为什么要进行内存对齐?
答:我的理解是:结构体大概是这样进行内存对齐的,首先是结构体中第一个成员是从地址为0的偏移处开始存放。在存放时,要对齐到其自身的对齐数处。对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。在VS中,默认对齐数是8 。结构体总大小为最大对齐数的整数倍。(最大对齐数:每一个成员的对齐数与默认对齐数的最小值)。如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,
this 指针
指向当前调用对象的指针。this指针不能在函数的形参和实参中显示写出,但是可以在类中显示写出。在成员函数中会有一个隐含的this指针(类名 * const this)
这里的图还是不够准确,应该是Data* const this。
需要注意的是:
-
每一个成员函数的this是两个不同的形参变量,他们的值取决于调用的对象是否相同。
-
如果调用的对象相同,则调用相同的函数产生的结果是相同的。
-
this 是存储在堆栈上的,不是存储在对象里面的。
构造函数
- 构造函数是用来对对象初始化的,并非是为对象开辟空间的。
- 构造函数的函数名与类名相同。
- 无返回值类型,不用写void
- 一个类中可以有多个构造函数,也就是构造函数是可以实现重载的。
- 在定义对象时,会自动调用构造函数,对对象进行初始化操作。
- 构造函数是类的默认成员函数,如果自己没有写,编译器会默认生成一个无参的构造函数。
- 默认构造函数:无参的构造函数、全缺省的构造函数、自己没写编译器自动生成的构造函数。在一个类中,有且只有一个默认构造函数。当有多个时,会出现调用冲突。
析构函数
- 析构函数是用来进行对对象资源的清理工作,而不是用来销毁对象,销毁对象是程序结束系统自动销毁回收空间的。
- 析构函数的函数名与类名相同。
- 无返回值也无参数。
- 一个类中只能有一个析构函数,不能实现重载。
- 在程序结束时,编译器会自动先调用析构函数。
- 构造函数是类的默认成员函数,如果自己没有写,编译器会默认生成一个无参的构造函数。
总结撒花💞
本篇文章旨在分享的是【小梦C嘎嘎——启航篇】类和对象(上篇)知识。希望大家通过阅读此文有所收获!
😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘