本节是对类初步的了解,熟悉以下内容:
1. 什么是类?什么是对象?面向对象和面向过程区别?
2. 如何定义一个类?用struct定义类和用class定义类的区别?
3. C++中如何实现封装?
4. 类的作用域:如何理解定义一个类,就定义了一个作用域?
5. 类的实例化:类为什么需要先实例化,才可以存储内容?
6. 如何求一个类的大小?空类的大小时多少,为什么?补充:什么是结构体内存对齐?为什么需要内存对齐?对齐参数如何设置?如何知道一个结构体相对于结构体起始位置的偏移量?什么是大小端?什么场景下需要考虑到大小端的情况?如何验证?
7. 什么是this指针?this指针的特性?this指针可以为空吗?this指针为空时,什么情况下代码一定崩溃?
1. 什么是类?什么是对象?
类:具有共同特征的事物所形成的种类(类别)。将具有某些共同属性的事物的共同属性总结出来,结果就是这些事物的种类(类别)。就像描述学生,有学号、姓名、年龄、性别、成绩等等属性,这些属性总结在一起,就是学生类。 在C++中,类中有事物的属性描述(数据元素),还有这些数据元素的初始化和赋值方式,以及类所能进行的活动(类的功能通过函数实现),即类中有数据元素,还有函数,甚至类中还有类,如学生类中还可以有班干部类。
对象:人们进行研究的具体的事物,如某个学生、或者其它的人事物都可以是对象。类实例化出来就是对象。
类和对象的关系:类实例化的结果就是对象。对对象的抽象描述就是类。类是模具,对象是铸件,将模具具化出来就是对象。
面向过程和面向对象有什么区别?
面向过程:从事物的发展过程来描述事物,从事件的发展步骤来分析事件,分析解决事件(问题)需要哪些步骤,然后实现这些步骤。强调的是步骤,在代码中体现为定义多个功能函数,然后按步骤将这些函数进行调用。
面向对象:将问题分解成多个对象,从事件的参与对象来分析事件,分析参与事件的对象有哪些,分别具有什么行为特性(功能),强调的是事件的对象以及对象的行为特性。在代码中体现为声明定义相关类,在类中定义出该类对象中的属性(数据元素),用函数描述行为(功能),然后实例化出需要的对象,通过对象与对象之间的交互来将问题解决。
2. 如何定义一个类?用struct定义类和用class定义类的区别?
定义类:class是定义类的关键字(struct也可以定义类),classname是类的名字,{}中是类的主体,主体中可以声明友元、定义函数、定义元素,结束时加分号。
class classname //class是类关键字, classname是类名 { //括号中为类的主体,定义类的成员 }; //结束分号不能少 //定义二一个学生类 class student { int Id[15]; char name[10]; int age; int gender; };
C++中的类是C语言中结构体的加强,所以c++中的类其实也是结构体,但与C中的结构体有明显的区别,C语言的结构体中只能定义变量,而C++中结构体可以定义变量,还可以定义函数。
在C++中,struct定义的类中的元素默认是共有的,外部可以访问,而class定义的类中元素默认是私有的,外部没有访问权限(友元除外)。(C++中喜欢使用class定义类)。 在C语言中,结构体中只能定义变量。
3. C++中如何实现封装?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和外界进行交互。本质上是一种管理。(如我们在网上冲浪时,我们的网名就是公开的属性,其他人能看到,而我们真实名字别人一般看不到,我们就是将真实姓名、身份证号等信息保护起来,不公开,而网名公开,信息管理) 用类将对象的属性与方法结合在一起,让对象更加完善。使用访问限定符来对规定访问权限,通过访问权限选择性的将其接口提供给外部的用户使用。 访问限定符有三个:1、public(公有)修饰的成员在类外可以直接被访问。 2、protected(保护)和private(私有)修饰的成员在类外不能直接被访问。 访问权限的作用域从该访问限定符出现的位置开始,到下一个访问限定符出现位置。 class声明的类默认访问权限为private,struct声明的类默认访文权限为public,因为struct要兼容C。在C中结构体的元素外部可以访问。 访问限定符只在编译时有用,数据映射到内存后,没有任何访问限定符的区别。即过了编译阶段,访问限定符就不在起作用。
class student { public: student() {} int A =5; protected: private: char Id[15] ; char name[10]; char gender; int age=18; }; int main() { student a; printf("%d\n", a.A);//能正常访问 //printf("%d\n", a.Id);//会报错,a.Id不可访问 sizeof(a); return 0; }
4. 类的作用域:如何理解定义一个类,就定义了一个作用域?
类是对某种类型的对象的属性(数据元素)和方法(函数)的描述集合,这些属性和方法在类中才起作用,在类外要使用类中的成员时,需要用作用域解析符指明成员属与那个类域。
5. 类的实例化:类为什么需要先实例化,才可以存储内容?
用类创建对象的过程称为类的实例化。 类是设计出的图纸,定义一个类,就是设计出某种图纸,不能说有了图纸就有了产品,就像画饼充饥,并不能真的画出大饼。只有真的做出大饼,才能在大饼中夹肉和蔬菜。(在陕西上学但是真的不喜欢吃肉夹馍 (QAQ))。 定义出一个类是不分配实际的内存空间来存储这个类的,就行int和char等类型,都是用来描述某一类数据或对象的特性的。 类只有实例化出对象,才分配物理存储空间,才能在对象中添加每个对象的真实数据。
6. 如何求一个类的大小? 一
个类的大小是该类中成员变量的大小之和,注意内存对齐。
空类的大小时多少,为什么?
空类的大小是一个字节。编译器给空一个字节的空间来唯一标识这个类。
什么是结构体内存对齐?
在结构体中,给大小不同的类型的成员变量,按一定规则去开辟空间存储,使成员变量按一定大小规律去存储。 默认的对齐方式是结构体中的成员变量,按其定下顺序,上一个变量的字节数是下一个的整数倍或相等,所有变量大小相加,结果调整到最大类型字节数的最小整数倍。
内存对齐中几个关于对齐值的概念:
1、基本类型自身对齐值:系统内置类型的大小,如char和int等类型的字节数就是它们的自身类型对齐值。
2、自定义类型对齐值: 结构体内部成员中,最大类型的字节数就是自定义类型对齐值。
3、程序指定的对齐值:通过 使用#pragma pack(n)来手动指定对齐值的大小 n要是2的次方,如1,2,4,8等。
4、有效对齐值:内存对齐时,将默认方式对齐值与程序指定对齐值进行比较,谁小谁就是有效对齐值。
为什么需要内存对齐?
1、不同的平台读写数据的方式不同,为了兼容性,需要做内存对齐。
2、提高效率,没有对齐的内存,访问时处理器要做两次访问工作,而对齐的内存,访问时处理器只用做一次工作。
对齐参数如何设置?
程序指定的对齐值:通过 使用#pragma pack(n)来手动指定对齐值的大小 n要是2的次方,如1,2,4,8等。
如何知道一个结构体相对于结构体起始位置的偏移量?
结构体的偏移量:结构体内某个成员变量相对于结构体地址的偏移值。(我自己的理解就是,成员变量的地址和结构体的起始地址的差值)。 求偏移量就用成员变量的地址减去结构体的起始地址。
什么是大小端?
大端模式:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。内存地址从左往右依次增大,我们的读数习惯就是大端模式。12345(万千百十个)。
小端模式:数据的高字节保存在内存的高地址中,数据的低字节保存在内存的低地址中。将权值与地址的高低结合起来,高地址部分权值大,低地址部分权值小。古人从右往左读的方式。如(个十百千万)五十四百三千二万一(54321)。
什么场景下需要考虑到大小端的情况?
查看内存中存储的数据时,我们将读取的数据进行组合还原时就要考虑大小端。
如何验证? 举一个简单的验证方式,代码如下
void CheckMode() { int a = 0x1234; char b = *(char*)&a; if (b == 0x12) { printf("大端模式.\n"); } else printf("小端模式.\n"); } int main() { CheckMode(); return 0; }
7. 什么是this指针?
this是c++中的一个关键字,是一个const修饰的指针。是成员函数中的一个默认形参,接收调用该函数的对象。 它指向当前对象,即调用成员函数的对象,通过它能访问到当前对象的成员变量和成员函数。
this指针的特性?
不用传参,const修饰的指针,是对象中成员函数的默认形参,不写在代码中,指向当前对象,通过它能访问到当前对象的成员。只能在函数的内部使用,在函数中,不在对象中。编译时通过压栈的方式传递。不能再static函数中使用。
this指针可以为空吗?this指针为空时,什么情况下代码一定崩溃?
可以为空,在不要通过this指针进行操作时,this指针可以为空。但如果需要用this指针对对象进行操作时,则发生错误。
原文:https://www.cnblogs.com/fengkun/p/11279857.html