C++类和对象(上)
创始人
2025-05-31 16:57:30
0

引入:

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++实现封装的方式:用类将对象的属性和方法结合到一起,让对象更加完善,通过访问权限,选择性的将其中的接口提供给外部的用户使用。

访问限定符的说明:

  1. public修饰的成员可以在类外直接被访问。

  1. protected和private修饰的成员不能在类外直接访问,这两者是相似的。

  1. 访问权限的作用域从该访问限定符开始到下一个访问限定符出现为止。

  1. 如果访问限定符后面没有另一个访问限定符,那么作用域就到这个类结束。

  1. class的访问限定符默认为private,而struct的访问限定符默认为public(兼容C语言)。

如上,因为Student类是class,默认访问限定符是private,所以不能在外部直接访问,而Student_stu就可以。

类的作用域

类定义了一个作用域,类的所有成员都在类的作用域中,在外部定义类中的成员时,需要使用域限定符::来指定这个成员是属于该类域的。

类的实例化

用类创建对象的过程,称为类的实例化。类是某个对象属性和交互行为的集合,类似于一张图纸,在写类的时候,并没有给类开辟空间,只有用这个类创建了对象之后,才会开辟空间。

类对象的大小

类对象在计算机中存储的方式是每个对象存储对应的成员变量,而对应的成员函数存储在公共代码段。

以下的实验在Visual Studio2019上进行:

#include
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;//结果是4cout << sizeof(s) << endl;//结果是1
}

类对象的大小计算规则和结构体内存对齐的规则一致(Visual Studio2019),想了解的话请看: C语言问题集——结构体及其内存对齐_c语言结构体对齐关键字_愿知的博客-CSDN博客。

需要注意的是在VS中,空类比较特殊,编译器给了1个byte来进行区别不同的空类。

对于封装想说的:

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。封装本质上是一种管理, 通过类将数据和方法放在一起, 分为隐藏的(成员变量) ,公开的,给别人用的设为公开的(开放成员函数),这样的好处:调用函数是绝对正确的,但如果你直接访问,因为你自己并不知道此功能的底层实现,所以可能会有问题。

C语言相对乏力。因为它的数据和方法是分离的,所以可以用函数访问,也可以直接访问,相对来说不规范,而C++可以通过类来将数据和方法结合到一起,可以规范的使用函数访问数据,使得人们不必纠结底层的实现细节,通过函数就可以拿到想要的数据。所以C++是一种更严格的管理,而C是一种相对松散的管理。

水平有限,欢迎指正。

相关内容

热门资讯

菲媒:菲律宾副总统称,不优先考... 【环球网报道】综合菲律宾《马尼拉标准报》等媒体6月1日报道,菲律宾副总统莎拉·杜特尔特称,她不优先考...
原创 美... 特朗普再次执掌白宫后,他的“地盘扩张梦”可谓是雷声大雨点小,搞得沸沸扬扬却未见实效。他本想一口气吞掉...
法网-郑钦文鏖战2-1萨姆索诺... 北京时间6月1日,2025赛季网球大满贯法国公开赛继续进行,在女单第三轮的一场比赛中,赛会8号种子、...
以国防军:黎以停火以来超180... △黎巴嫩南部地区(资料图) 以色列国防军当地时间6月1日下午发布消息称,当天上午,一名黎巴嫩真主党特...
深夜,巨子生物突发声明:接受检... 每经编辑|金冥羽 巨子生物旗下重组胶原蛋白品牌可复美产品成分争议持续发酵。 6月1日22点32分,...
新修订的《快递暂行条例》6月1... 6月1日起,《国务院关于修改〈快递暂行条例〉的决定》正式施行。此次修改,专门增加了“快递包装”章节,...
开放“以债换房”政策,可直接置... “南京网络辟谣”微信公众号6月1日发文称,近日,有“南京二手房零首付李经理”“合肥瑶珺房地产代理有限...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
基于TDesign风格的Bla... 作为一名Web开发人员,开发前端少不了使用JavaScript,而Bla...