用户自定义类型#
一个对象不仅仅存在状态(比如,量的描述),还有行为(比如,运算符)。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;
// ...
};
结构主要用于成员可以取任意值的数据结构。