1、类的简要概括如下:
- 一个类就是一个用户自定义类型。
- 一个类由一组成员构成。最常见的成员类别是数据成员和成员函数。
- 成员函数可定义初始化(创建)、拷贝、移动和清理(析构)等语义。
- 对对象使用.(点)访问成员,对指针使用->(箭头)访问成员。
- 可以为类定义运算符,如+、!和[]。
- 一个类就是一个包含其成员的名字空间。
- public成员提供类的接口,private成员提供实现细节。
- struct是成员默认为public的类。
class X{
private: //类的表示(实现)是私有的
int m;
public: //用户接口是公有的
X(int i=0):m{i}{} //构造函数(初始化数据成员m)
int mf(int i) //成员函数
{
int old = m;
m = i; //设置一个新值
return old; //返回旧值
}
};
X var {7}; //一个X类型的变量,初始化为7
int user(X var, X* ptr)
{
int x = var.mf(7); //使用.(点)访问
int y = ptr->mf(9); //使用->(箭头)访问
int z = var.m; //错误:不能访问私有成员
}
2、声明于类定义(struct也是一种类)内的函数称为成员函数。对恰当类型的特定变量使用结构成员访问语法才能调用这种函数。
3、由于不同结构可能有同名成员函数,在定义成员函数时必须指定结构名。
Date my_birthday;
void f()
{
Date today;
today.init(16,10,1996); //使用结构成员访问语法
my_birthday.init(30,12,1950);
Date tomorrow = today;
tomorrow.add_day(1);
}
void Date::init(int dd, int mm, int yy) //定义函数时必须指定结构名
{
d = dd;
m = mm;
y = yy;
}
4、默认情况下,对象是可以拷贝的,一个类对象的副本是对每个成员逐个拷贝得到的。
5、类主体中,私有的(private),它们只能被成员函数使用。公有的(public),表示它们是构成类对象的公共接口。
6、构造函数专门完成类的初始化任务,它的显著特征是与类具有相同的名字。
7、通过提供多个构造函数,可以为某类型的对象提供多种不同的初始化方法。构造函数的重载规则与普通函数相同,只要构造函数的参数类型明显不同,编译器就能选择正确的版本使用。
8、如果构造函数声明带有关键字explicit,则它只能用于初始化和显式类型转换。默认情况下,应将单参数的构造函数声明为explicit。
9、为数据成员添加初始化器,可以减少构造函数的数量。
Date today = Date(23, 6, 1983);
class Date{
int d{today.d}; //使用初始化器引入默认值
int m{today.m}; //使用初始化器引入默认值
int y{today.y}; //使用初始化器引入默认值
public:
Date(int, int, int);
Date(int, int);
Date(int);
Date();
Date(const char*);
}
10、如果一个函数不仅在类中声明,还在类中定义,那么它就被当做内联函数inline处理。
11、函数声明中(空)参数列表后的const指出这些函数不会修改类对象成员变量的状态。
12、我们可以将一个类成员定义为mutable,表示即使是在const对象中,也可以修改此成员。
class Date{
public:
//...
string string_rep() const; //字符串表示
private:
mutable bool cache_valid;
mutable string cache;
void compute_cache_value() const; //填入(可变的)缓存
}
13、在非static成员函数中,关键字this是指向调用它的对象的指针。在类X的非const成员函数中,this的类型时X*。在类X的const成员函数中,this的类型时const X*,以防止修改对象。
14、我们可以通过对类X的对象使用.(点)运算符或对X的对象的指针使用->(箭头)运算符来访问X的成员。
15、如果我们希望引用类的一个公共成员,而不是某个特定对象的成员,应该使用类名后接::的限定方式。
struct S{
int m;
int f();
static int sm;
}
int X::f(){return m;}
int X::sm{7};
int (S::*)pmf(){&S::f};
16、static成员是类的一部分,但不是某个类对象的一部分,static成员只有唯一副本,而不是像非static成员那样每个对象都有其副本。使用类名字作为限定,可以不必提及任何对象即可引用static成员。
void f()
{
Date::set_default(4, 5, 1945);
}
如果使用了static函数或数据成员,我们就必须在某处定义他们。在static成员的定义中不要重复关键字static。
Date Date::default_date{16,12,1770}; //Date::default_date的定义
void Date::set_default(int d, int m, int y) //Date::set_default的定义
{
default_date = {d, m, y}; //将新值赋予default_date
}
17、成员类(嵌套类)可以引用其所述类的类型和static成员。当给定所属类的一个对象时,只能引用非static成员。
18、表示辅助函数与类的关联时,早期与C语言一样,这些函数的声明简单地放在类声明所在的文件中。用户只需要包含定义接口的文件即可使用。此外,还有一种替代方法是将类及其辅助函数放在一个名字空间中显示表明两者的关系。