引入:
C语言是面向过程的,关注的是过程,就是分析出解决问题的步骤,然后通过调用不同的函数来解决问题。而C++是面向对象的,就是在解决一个问题时,重心放在该问题所涉及的具体事物上,通过描述这些具体事物,把问题抽象成为事物与事物之间的交互,从而解决问题。也就是看待同一个问题的角度不同,C语言聚焦于问题本身解决的过程,而C++聚焦于问题中涉及到的事物之间的联系。
类的引入:
对于类,笔者的理解是:在描述一个对象的时候,我们需要描述该对象在一个问题中的属性以及该对象在该问题中所具有的交互行为。而类就是一个对象属性和行为的集合。
在C语言中,结构体struct就可以记录一个自定义类型的所有属性,如一个学生拥有学号,姓名等,但是C语言中的struct是不能描述自定义类型的交互行为的,也就是不能定义函数,而在C++中,struct中是可以定义函数的,可以理解为可以描述自定义类型的交互行为。但在C++中,常用class来声明一个类。
请看以下代码:
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
struct Student_stu
{
char* _name;
int _age;
void Print_Age()
{
std::cout << _age << std::endl;
}
};
class Student
{
char* _name;
int _age;
void Print_Age()
{
std::cout << _age << std::endl;
}
};
int main()
{
//定义一个对象
Student s1;//Student类的一个名字叫s1的对象
Student_stu s2//Student_stu类的一个名字叫s2的对象
//C语言中需要加上struct但是C++中将其视为一个类,只需要类名就可以定义对象。
}
上面只是为了展示一个类如何定义,其实一般我们都是在.h文件中进行类的声明,再到.cpp文件中写函数的定义,另外,在类内定义的函数,默认在其前加上了inline。
//Student.h文件中
class Student
{
public:
void Print_Age();
public:
int _age;
char* _name;
}
//Student.cpp文件中
#include"Student.h"
void Student::Print_Age()
{
std::cout << _age << std::endl;
}
类的访问限定符和封装
C++实现封装的方式:用类将对象的属性和方法结合到一起,让对象更加完善,通过访问权限,选择性的将其中的接口提供给外部的用户使用。
![](https://img-blog.csdnimg.cn/img_convert/5084752947ed468ea2cabe685469ee7e.png)
访问限定符的说明:
public修饰的成员可以在类外直接被访问。
protected和private修饰的成员不能在类外直接访问,这两者是相似的。
访问权限的作用域从该访问限定符开始到下一个访问限定符出现为止。
如果访问限定符后面没有另一个访问限定符,那么作用域就到这个类结束。
class的访问限定符默认为private,而struct的访问限定符默认为public(兼容C语言)。
![](https://img-blog.csdnimg.cn/img_convert/476a8f9a681d41959b48dcf36bffaed1.png)
如上,因为Student类是class,默认访问限定符是private,所以不能在外部直接访问,而Student_stu就可以。
类的作用域
类定义了一个作用域,类的所有成员都在类的作用域中,在外部定义类中的成员时,需要使用域限定符::来指定这个成员是属于该类域的。
![](https://img-blog.csdnimg.cn/img_convert/01f6ecf98f5e4540a2713e97ed35ae67.png)
类的实例化
用类创建对象的过程,称为类的实例化。类是某个对象属性和交互行为的集合,类似于一张图纸,在写类的时候,并没有给类开辟空间,只有用这个类创建了对象之后,才会开辟空间。
类对象的大小
类对象在计算机中存储的方式是每个对象存储对应的成员变量,而对应的成员函数存储在公共代码段。
以下的实验在Visual Studio2019上进行:
#include<iostream>
using namespace std;
class Person
{
public:
void Print();
private:
int _age;
};
class Student
{
public:
void Print();
};
//这里需要指定Print是属于Person这个类域
void Person::Print()
{
cout << _age << endl;
}
int main()
{
Person p;
Student s;
cout << sizeof(p) << endl;//结果是4
cout << sizeof(s) << endl;//结果是1
}
类对象的大小计算规则和结构体内存对齐的规则一致(Visual Studio2019),想了解的话请看: C语言问题集——结构体及其内存对齐_c语言结构体对齐关键字_愿知的博客-CSDN博客。
需要注意的是在VS中,空类比较特殊,编译器给了1个byte来进行区别不同的空类。
对于封装想说的:
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。封装本质上是一种管理, 通过类将数据和方法放在一起, 分为隐藏的(成员变量) ,公开的,给别人用的设为公开的(开放成员函数),这样的好处:调用函数是绝对正确的,但如果你直接访问,因为你自己并不知道此功能的底层实现,所以可能会有问题。
C语言相对乏力。因为它的数据和方法是分离的,所以可以用函数访问,也可以直接访问,相对来说不规范,而C++可以通过类来将数据和方法结合到一起,可以规范的使用函数访问数据,使得人们不必纠结底层的实现细节,通过函数就可以拿到想要的数据。所以C++是一种更严格的管理,而C是一种相对松散的管理。
水平有限,欢迎指正。