news 2026/4/28 20:16:43

C++类的定义与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++类的定义与实现

一、类的定义

根据C++ Primer中的描述,类的定义是一种将抽象转换为用户定义类型的C++工具。也就是说类的实质是一种用户自定义类型,它可以将数目表示和操作数据的方法组合成一个整洁的包。

在实际开发当中,想要实现一个类,并编写一个使用它的程序是相对比较复杂的,涉及多个步骤。

通常,我们会将类的定义放在头文件当中,并将实现的代码放在源代码文件中。我们来看C++ Primer当中的一个例子:一个关于股票买卖的类。

首先是类的定义,写在stock00.h文件中:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#ifndef STOCK00_H_

#define STOCK00_H_

#include <string>

classStock {

private:

std::string company;

longshares;

doubleshare_val;

doubletotal_val;

voidset_tot() {total_val = shares * share_val;}

public:

voidaccquire(conststd::string &co,longn,doublepr);

voidbuy(longnum,doubleprice);

voidsell(longnum,doubleprice);

voidupdate(doubleprice);

voidshow();

};

#endif

首先是关键字class,它表示我们声明的是一个类,一般类名我们使用大驼峰命名法定义。

其次在这个类的定义当中,我们看到了两个新出现的关键字privatepublic。这两个关键字描述了对类成员的访问控制,使用类对象的程序,都可以直接访问公有部分(public),但无法访问对象的私有成员。

想要获取私有成员,只能通过公有的成员函数。比如在上面这个例子当中,我们想要修改share_val只能通过公有的方法sellbuy,而无法直接对变量的值进行修改。防止程序直接访问数据修改数据被称为数据隐藏。

除了publicprivate,C++当中还提供了第三个关键字叫做protected,这个关键字和类的继承有关,我们将会在之后的文章当中进行讨论。

数据隐藏的思想其实是认为类中的成员变量的所有权应该属于类本身,当我们需要对类中的数据进行读取和修改的时候,应当通过类提供的公开方法,而不是直接操作类中值。这被认为是一种面向对象的思想,即只能通过类提供的方法访问数据,而不应该直接访问数据。

C++正是基于这种面向对象的思想设计的,所以类中的成员默认是private的,我们可以省去private关键字:

1

2

3

4

5

6

7

8

classWorld {

floatmass;

charname[30];

public:

voidtellall();

...

};

我们从类的描述看上去很像是包含了成员函数以及数据隐藏的结构体,但实际上这是因为C++对结构体进行了拓展,让它具有了和类相同的特性。在C语言当中,结构体是没有这么多特性的。

比如我们可以给结构体设计构造函数,也可以给结构体添加成员函数,甚至结构体也可以继承、派生和多态。

它们之间唯一的区别是,结构体的默认类型是public,而类是private。所以通常使用类来实现对象,而结构体只用来结构化地存储数据。

另外多说一句,数据隐藏的面向对象理念并不适用于所有语言。比如Python,Python当中的类中的成员变量默认是public,且没有private关键字。

二、类的实现

当我们完成了类定义之后, 还需要来实现类当中的函数。

比如我们在stock00.h当中定义了一个类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#ifndef STOCK00_H_

#define STOCK00_H_

#include <string>

classStock {

private:

std::string company;

longshares;

doubleshare_val;

doubletotal_val;

voidset_tot() {total_val = shares * share_val;}

public:

voidaccquire(conststd::string &co,longn,doublepr);

voidbuy(longnum,doubleprice);

voidsell(longnum,doubleprice);

voidupdate(doubleprice);

voidshow();

};

#endif

1.成员函数

在这个定义当中,我们只是声明了函数,并没有具体实现函数的逻辑。

我们通常会在同名的cpp文件当中实现,实现的时候,需要使用作用域解析运算符来表示函数所属的类:

1

2

3

voidStock::update(doubleprice) {

...

}

这样就表明了update函数所属Stock这个类,这也就意味着我们可以创建属于其他类的同名函数:

1

2

3

voidBuffoon::update() {

...

}

其次,我们在成员函数当中,可以访问private限定的成员变量。比如说在show函数当中,我们可以这样实现:

1

2

3

voidStock::show() {

std::cout << company << shares << share_val << total_val << endl;

}

虽然company,shares都是类的私有成员,但在成员方法当中,一样可以正常访问。

再次,我们在成员方法当中调用另外一个成员方法,可以不需要解析运算符。比如我们要在show函数内调用update函数,直接使用update()即可,而无需前面的Stock::。

2.内联函数

我们再回过头来看一下Stock这个类的定义,在类的定义当中,有一个叫做set_tot的函数。我们直接在类当中实现了逻辑。虽然同样是成员函数,但是在类当中直接实现的函数是有所区别的。在类声明当中实现的函数,会被视为是内联函数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 20:16:38

Get-cookies.txt-LOCALLY:隐私优先的本地Cookie管理工具箱

Get-cookies.txt-LOCALLY&#xff1a;隐私优先的本地Cookie管理工具箱 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在当今数字时代&#xff0c;…

作者头像 李华
网站建设 2026/4/28 20:10:20

告别理论:用OpenCV和ORB特征点,手把手实现一个简易视觉SLAM原型

告别理论&#xff1a;用OpenCV和ORB特征点&#xff0c;手把手实现一个简易视觉SLAM原型 视觉SLAM&#xff08;VSLAM&#xff09;听起来像是实验室里的高深技术&#xff0c;但它的核心思想其实很直观&#xff1a;让计算机像人一样&#xff0c;通过观察周围环境来定位自身并构建…

作者头像 李华
网站建设 2026/4/28 20:09:22

别让网络拖后腿!手把手教你配置PFC,搞定RoCEv2无损网络

别让网络拖后腿&#xff01;手把手教你配置PFC&#xff0c;搞定RoCEv2无损网络 在数据中心的高性能计算和存储场景中&#xff0c;网络延迟和丢包往往是性能瓶颈的罪魁祸首。RoCEv2&#xff08;RDMA over Converged Ethernet version 2&#xff09;作为一种高性能网络协议&#…

作者头像 李华
网站建设 2026/4/28 20:09:20

SWAT模型效率提升:如何用土地利用重分类优化你的HRU数量与模拟速度

SWAT模型效率革命&#xff1a;土地利用重分类的HRU优化策略与实战技巧 当你的SWAT模型运行时间从3小时缩短到20分钟&#xff0c;而模拟精度仅下降1.2%时&#xff0c;这种效率提升带来的科研生产力飞跃是惊人的。作为水文建模领域的从业者&#xff0c;我经历过无数次深夜等待模型…

作者头像 李华