类的界说
类界说格式
• class为界说类的关键字,Data为类的名字,{}中为类的主体,留意类界说结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或 者成员函数。
• 为了区分成员变量,⼀般风俗上成员变量会加⼀个特别标识,如成员变量前⾯或者后⾯加_ 或者 m 开头,留意C++中这个并不是强制的,只是⼀些惯例,详细看公司的要求。
• C++中struct也可以界说类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以界说函数(与c语言的差别之处),⼀般情况下我们还是推荐⽤class界说类。
这里简单给一个案例了解一下c++类的基本构造。
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<iostream>
- using namespace std;
- //定义一个日期类,并对其初始化
- class Data {
- //成员属性
- private:
- int _year;
- int _mouth;
- int _day;
- //成员方法
- public:
- void Init(int year, int mouth, int day) {
- _year = year;
- _mouth = mouth;
- _day = day;
- }
- };
- int main() {
- Data D;
- D.Init(2024, 7, 27);
- return 0;
- }
复制代码 对于public private是访问限定符。
访问限定符
• C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限,选择性的将其接⼝提供给外部的用户使⽤。
• public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是⼀样的,以后继承章节才气体现出他们的区别。
由下图可以看出,_day是被public修饰,可以直接访问,_year是被private修饰不能直接访问。
• 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,假如后⾯没有 访问限定符,作⽤域就到 }即类结束。
• class界说成员没有被访问限定符修饰时默认为private,struct默认为public。
下图是两则区别
• ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。
类域
• 类界说了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外界说成员时,需要使⽤ :: 作 ⽤域操纵符指明成员属于哪个类域。
• 类域影响的是编译的查找规则,下⾯程序中Init假如不指定类域Data,那么编译器就把Init当玉成 局函数,那么编译时,找不到成员的声明/界说在哪⾥,就会报错。指定类域Data,就是知 道Init是成员函数,当前域找不到的成员,就会到类域中去查找。
如下图所示,在类外面界说。
找出在那个类域界说的
实例化
实例化概念
• ⽤类 范例在物理内存中创建对象的过程,称为类实例化出对象。
比如上述代码以Data 为类名创建对象 :Data D;
然后再用对象调用公共方法: D.Init();
• 类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只 是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。
这些成员变量在类中只做声明并未初始化空间。
实例化对象之后才为成员变量开发空间
更详细表明:
• ⼀个类可以实例化出多个对象,实例化出的对象 占⽤实际的物理空间,存储类成员变量。打个⽐ ⽅:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多 少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房 ⼦才气住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。
对象大小
在介绍类的大小前我们先了解一下之前学过的(struct)结构体的大小。
在结构体中成员变量的大小要按照内存对齐的方式进行计算,
内存对⻬规则
• 第⼀个成员在与结构体偏移量为0的地点处。
• 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地点处。
• 留意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。
• VS中默认的对⻬数为8 • 结构体总⼤⼩为:最⼤对⻬数(所有变量范例最⼤者与默认对⻬参数取最⼩)的整数倍。
• 假如嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的团体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
先简单举个例子。
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<stdio.h>
- struct Size {
- char a;
- int b;
- double c;
- };
- int main() {
- struct Size s1;
- printf("%d", sizeof(s1));
- return 0;
- }//运行结果为16
复制代码 假设我们界说了一个结构题,;里边存有char int double范例的数据,按字节计算应该是1+4+8=13.运算效果是16,下面就介绍一下他计算原理。
第一个·成员变量char存储在结构体偏移量为0的地点处。(大小一个字节)
第二个成员变量的都对齐数是(该范例字节大小与编译器规定的较小者)4;以是储存在相对结构体偏移量为4的地方存储。
第三个成员变量的对齐数是8,以是储存在相对结构体偏移量为8的地方存储。
最后计算结构体变量总大小,按照存储变量最大范例字节的整数倍计算,最大范例为double(8)字节,整数倍恰好为16字节。
可能有些师傅会想,为什么会是这样存储呢,直接接纳下面存储不是更省空间吗?
这是因为cpu在读取内存的时间并不是在任意位置都能读取, 实际当中规定cpu只能从整数倍位置开始读,差别范例版本读取范例差别,假设一次读取个字节,向右边那种情况先读取个字节,那么读取的第二个int范例就不完整。以是才有这种对齐方式。
C语言结构体大小介绍完,现在介绍一下类大小的计算。
类大小计算
类大小的计算与c语言结构体大小的计算式一样的,之不外我们知道C++中的类与C语言结构体的最大区别是C++类中具有方法(函数),但这个方法(函数)的大小是可以忽略的。这时因为在类中真正调用函数时调用的就是一个下令不占用空间大小。、
特别类大小计算
- class B
- {
- public:
- void Print()
- {
- //...
- }
- };
复制代码 以上两个类中一个只有一个方法一个什么没有,但我们并不能就简单的说,他们的大小时0,实际情况是他们的大小都是1。因为假如⼀个字节都不给,怎么表现对象存在过呢!以是这⾥给1字节,纯粹是为了占位标识对象存在。
this指针关键字(了解)
• Date类中有 Init 与 Print 两个成员函数,函数体中没有关于差别对象的区分,那当d1调⽤Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这⾥就要看到C++给了 ⼀个隐含的this指针解决这⾥的问题
• 编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类范例的指针,叫做this 指针。⽐如Date类的Init的真实原型为, void Init(Date* const this, int year, int month, int day)
• 类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值, this- >_year = year; • C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显 ⽰使⽤this指针。
(未完,待续。。。。。。)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |