目录
1. C和C++的主要区别是什么?
2. 类
3. 类的定义
类的两种定义方法
4. 类的访问限定符及封装
4.1 访问限定符
4.2 封装
5. 类的作用域
6. 类的实例化
7. 类的大小
7.1 求出类的大小
1. C和C++的主要区别是什么?
C语言是面向过程的,注重的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于面向对象的,注重的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
2. 类
在C语言中struct只能定义变量,而在C++中struct可以定义变量,也可以定义函数。
而在C++中更喜欢用class来代替struct。
3. 类的定义
class Student {
//类体:由成员变量和成员函数共同构造
};
class是类的关键字,student是类名,{ }里面是类体,注意定义类以后要加上分号。
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
类的两种定义方法
1. 声明和定义都在类里面
如果在类中定义函数,一般会被认为成内联函数。
struct Student
{
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
char _name[20];
char _gender[3];
int _age;
};
2.声明在.h文件中,定义在.cpp文件中
一般来说定义就是这种格式,但是在类中定义的函数的作用域也就是类中,在类外面定义时要说明是该类中的函数,因此我们需要加上类名::
一般情况下我们推荐第二个方法。
4. 类的访问限定符及封装
4.1 访问限定符
在C++中分为三种访问限定符分别是:1. public 2. protected 3. private,被不同的限定符修饰产生的效果也不同:
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
如果只有public一个限定符,则从:一直到 }都是public修饰的
我们可以看到变量可以在类外使用,因为他是public修饰的
当成员变量上分加上private时,表示以下都是private修饰的,类外也自然无法访问。
4. class的默认访问权限为private,struct为public(因为struct要兼容C)
刚开始的时候,通过struct引入了类,那class和struct之间的区别是什么呢?
因为C++是基于C产生的所以C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。 和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是的成员默认访问方式是 private。
4.2 封装
面向对象有三大特征:封装、继承、多态,它们三个也是面向对象的精髓所在。
那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互,封装能帮助我们增强代码的健壮性,不需要考虑使用该接口人的技术水平。
封装就是一种管理,把一个类比作成为一个博物馆,public修饰的就是游客可以观看的,private修饰的就是不可以被看的,我们将我们想让别人拿出来,不想让别人看或者修改的就隐藏起来。
5. 类的作用域
在C或者C++中定义的变量或者函数都是从下向上找寻的,类中也遵循这个规律吗?
发现如果按照上面的规律,那Print函数无法访问下面三个变量,但是在类中却可以访问,说明在类中定义的变量和函数在类中任何位置都可以使用。
6. 类的实例化
使用类类型创建对象时,被称为类的实例化。
1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
2. 一个类可以实例化出多个对象,实例化出的对象才会使用实际的物理空间,存储类成员变量。
3. 类就是一个建筑图纸,创建对象就相当于实现建筑,如果不创造对象,那类就是一个模型。
7. 类的大小
7.1 求出类的大小
一个类中包含了函数和变量,那创建出的对象中包含什么呢?
1. 对象中包含了函数和变量
2. 对象中只包含了变量,函数包含在公共的代码段中
首先我们来回顾下计算结构体的大小:
1. 第一个成员在与结构体偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。 VS中默认的对齐数为8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是 所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
通过计算结构体的方法来计算类的大小,发现得出的是同一个值
通过反汇编我们也可以看见对象中调用的函数也是同一个地址。
我们可以发现创建出的对象应该只包含了变量,而函数包含在公共的代码段中。
我们发现当类中只有函数成员或者没有成员时,类的大小也不会是0,编译器会给空类一个字节来表示这个类。



