C++类的定义与实现

目录
  • 一、类的定义
  • 二、类的实现
    • 1.成员函数
    • 2.内联函数

文章转自 微信公众号:Coder梁(ID:Coder_LT)

一、类的定义

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

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

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

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

#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock {
    private:
     std::string company;
     long shares;
     double share_val;
     double total_val;
     void set_tot() {total_val = shares * share_val;}
    public:
     void accquire(const std::string &co, long n, double pr);
     void buy(long num, double price);
     void sell(long num, double price);
     void update(double price);
     void show();
};
#endif

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

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

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

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

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

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

class World {
    float mass;
    char name[30];

public:
    void tellall();
    ...
};

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

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

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

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

二、类的实现

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

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

#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock {
    private:
     std::string company;
     long shares;
     double share_val;
     double total_val;
     void set_tot() {total_val = shares * share_val;}
    public:
     void accquire(const std::string &co, long n, double pr);
     void buy(long num, double price);
     void sell(long num, double price);
     void update(double price);
     void show();
};
#endif

1.成员函数

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

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

void Stock::update(double price) {
    ...
}

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

void Buffoon::update() {
    ...
}

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

void Stock::show() {
    std::cout << company << shares << share_val << total_val << endl;
}

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

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

2.内联函数

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

一般我们会把一些比较简短的函数在类的声明当中直接实现,当然我们也可以使用关键字inline,手动指定某个函数是内联的。

class Stock {
    private:
    void set_tot();
    public:
    ...
};

inline void Stock::set_tot() {
    total_val = shares * share_val;
}

到此这篇关于C++类的定义与实现的文章就介绍到这了,更多相关C++类的定义与实现内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 实现自定义类型的迭代器操作

    ##动机 我们知道STL实现了很多算法(#include<algorithm>),如果项目是基于STL构建那么能够最大化使用现有代码当然是最好的.在STL中容器和算法之间的桥梁是迭代器.所以在定义好自定义类型的容器后,接下来就是迭代器的实现. STL中的迭代器 迭代器模式是一种经典的设计模式,而STL的迭代器实现用到了模板的一些特性和技能,在这里稍微介绍一下 下面是STL中结构体iterator的定义,这么定义是给后面的算法多态和萃取时(具体见书中介绍)使用的. 其中的_Category 和_

  • C++中多态的定义及实现详解

    1. 多态概念 1.1 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态. 举个栗子:比如买票,当普通人买票时,是全价买票:学生买票时,是半价买票:军人买票时是优先买票.同一个事情针对不同的人或情况有不同的结果或形态. 2. 多态的定义及实现 2.1 多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为.比如Student继承了Person. Person对象买票全价,Student对象买票半价. 注意:那么在继

  • 关于js类的定义

    遇到的问题,首先是js对象的封装,js没有提供类的机制,唯一的内置类是function类,也就是说所有的函数都是function类的实例化对象.不过依靠这个唯一的类我们可以模拟定义一个新的类. 首先想到的,是直接用function生成定义完整的类: 复制代码 代码如下: function myClass(arg,...) { this.attributeName; this.functionName = function(){}; } 不过这样有一个问题,每当我new一个新的myClass实例的

  • JavaScript 类的定义和引用 JavaScript高级培训 自定义对象

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascript中,已经存在一些标准的类,例如Date.Array.RegExp.String.Math.Number等等,这为我们编程提供了许多方便.但对于复杂的客户端程序而言,这些还远远不够. 与Java不同,Java2提供给我们的标准类很多,基本上满足了我们的编程需求,但是Javascript提供的标准类很

  • JS类的定义与使用方法深入探索

    本文实例分析了JS类的定义与使用方法.分享给大家供大家参考,具体如下: js可以定义自己的类 很有意思 <script type="text/javascript"> var Anim = function() { alert('nihao'); }; Anim.prototype.start = function() { alert('start'); }; Anim.prototype.stop = function() { alert('stop'); }; var

  • PHP面向对象程序设计类的定义与用法简单示例

    本文实例讲述了PHP面向对象程序设计类的定义与用法.分享给大家供大家参考,具体如下: <?php class Person { private $name; private $sex; private $age; function __construct($name = "", $sex = "男", $age = 22) { $this->name = $name; $this->sex = $sex; $this->age = $age;

  • php类的定义与继承用法实例

    本文实例讲述了php类的定义与继承用法.分享给大家供大家参考.具体如下: <?php /* * class */ class people { public $name; public $age; function __construct($namec,$agec) { $this->name = $namec; $this->age = $agec; } protected function getmessage() { return "姓名:".$this->

  • 关于function类中定义变量this的简单说明

    关于function类中定义变量this的简单说明 <!DOCTYPE html> <html> <head> </head> <script> function TObject(){ this.name1 = "aa";//这里不能写name,name是window的变量.否则无法得到验证结果 } var t = new TObject();//执行中,this代表t alert("window1="+t

  • Visual C#类的定义及实现方法实例解析

    本文实例演示了visual C#下一个类的定义及实现方法,虽然是一个较为基础的C#代码实例,对于新手来说仍然有很好的参考价值. 具体的实例代码如下: using System; public class Desk//基类Desk { protected int length;//保护成员 protected int width; protected int height; //类Desk的构造函数 public Desk( ) { length = 0; width = 0; height =

  • Android编程图片加载类ImageLoader定义与用法实例分析

    本文实例讲述了Android编程图片加载类ImageLoader定义与用法.分享给大家供大家参考,具体如下: 解析: 1)图片加载使用单例模式,避免多次调用时产生死锁 2)核心对象 LruCache 图片加载时先判断缓存里是否有图片,如果有,就使用缓存里的 没有就加载网络的,然后置入缓存 3)使用了线程池ExecutorService mThreadPool技术 4)使用了Semaphore 信号来控制变量按照先后顺序执行,避免空指针的问题 如何使用: 在Adapter里加载图片时 复制代码 代

  • Android编程录音工具类RecorderUtil定义与用法示例

    本文实例讲述了Android编程录音工具类RecorderUtil定义与用法.分享给大家供大家参考,具体如下: 以下工具类都是经过实战开发验证都是可以直接复制使用的. 录音工具类介绍: 录音工具类主要平时用来开发语音聊天的,在微信和QQ上该工具类都是常用的,因为语音聊天. 使用硬件一般都要开权限,别忘了.这里还需要搭配 Android FileUtil 类使用,为了方便才这么封装的 import android.media.MediaRecorder; import android.util.L

  • VBS基础篇 - vbscript class类的定义与使用

    从网上看到一个vbs中使用class的例子, 转出来,共同学习! Class 语句:声明一个类的名称,以及组成该类的变量.属性和方法的定义. vbs类的使用方法 类的结构: class 类名称      end class 调用方法 set myclass=new 类名称    中间类里面的代码,      类模块的事件过程. Private Sub Class_Initialize() 这里写上类实例化的时候执行的代码. end sub Private Sub class_terminate(

随机推荐