用户自定义类型

用户自定义类型#

一个对象不仅仅存在状态(比如,量的描述),还有行为(比如,运算符)。C++ 提供“类”这一概念用于此目的。一个类就是一个用户自定义类型,由一些内置类型、其他用户自定义类型以及一些函数组成。这些用于定义类的组成部分称为 成员 (member)。

类的结构可以表示为:

class X {   // 类的名字为 X
public:
    // 公共成员;
    // - 用户接口(可被所有人访问)
    // 函数
    // 类型
    // 数据(通常最好为 private)
private:
    // 私有成员;
    // - 实现细节(仅能被该类的成员访问)
    // 函数
    // 类型
    // 数据
};

类的数据成员用于定义类对象的表示方法;函数成员提供类对象的运算。

类成员默认是私有的,即:

class X {
    int mf(int);
    // ...
};

等价于

class X {
private:
    int mf(int);
    // ...
};

类成员的访问使用符号 object.member。例如

class X {
public:
    int m; // 数据成员
    int mf(int v) { // 函数成员
        int old = m;
        m = v;
        return old;
    }
};
X var; // var 为 类型 X 的变量,即 X 的对象
var.m // 查看 var 的数据成员 m 的初始值
0
var.m = 7; // 对 var 的数据成员 m 赋值
7
int x = var.mf(77); // 调用 var 的成员函数 mf()
x // x 获取的是 var 的数据成员 m 前一个状态值
7
var.m // 获取的是 var 的数据成员 m 当前状态值
77

接口和实现#

类的声明分为两个部分:接口和实现。公有的接口用标号 public: 标识。实现用标号 private: 标识。用户只能通过接口间接的访问实现。

比如定义如下类:

class X {
    int m; // 数据成员
    int mf(int v) { // 函数成员
        int old = m;
        m = v;
        return old;
    }
};

用户不能直接访问实现部分:

X x;
int y = x.mf() // 错误:mf 是私有的,不能直接访问

用户需要借由公有函数访问实现:

class X {
    int m; // 数据成员
    int mf(int v) { // 函数成员
        int old = m;
        m = v;
        return old;
    }
public:
    int f(int i) {
        m = i;
        return mf(i);
    }
};
X x;
int y = x.f(5); // 正确

结构体#

若类只包含数据的话,接口和实现的区分没有太大意义。C++ 使用 结构 (struct)来描述没有私有实现细节的类。一个结构就是成员默认为公有属性的类:

struct X {
    int m;
    // ...
};

即为:

class X {
public:
    int m;
    // ...
};

结构主要用于成员可以取任意值的数据结构。