1. 类
类是用户定义类型。
类类型可由类指定符定义,它出现于声明语法的 decl-specifier-seq 中。
类格式:1.class_key arrt class_head_name{};
class_key:可以为class、struct、union.
arrt: 可选的任意数量的属性序列.
class_head_name:被定义的类名。可选地前接 nested-name-specifier (名称和作用域解析运算符的序列,以作用域解析运算符结尾),可选地后随关键词 final 。可以忽略该名称,此情况下类是无名的(注意无名类不可为 final )
2.class-key attr class-head-name : base-specifier-list { member-specification }
base-specifier-list - 一或多个亲类及对每个使用的继承模式的列表,如基类延伸派生类,如:
//基类
class Vehicle
{
public:
void Initp(int x = 0,double y =0)
{
number = x;
weight = y;
}
int set_x()
{
return number;
}
int set_y()
{
return weight;
}
private:
int number;
int weight;
};
//派生类
class Car:public Vehicle
{
public:
void Initr(int x,double y,int z)
{
Initp(x,y);
num = z;
}
void set_v()
{
int a = set_x();
int b = set_y();
cout << "Number of wheels:" << a << endl;
cout << "Vehicle weight:" << b << endl;
cout << "seating capacity:" << num << endl;
}
private:
int num;
};
//派生类
class Trunk:public Vehicle
{
public:
void Initk(int x,double y,int z)
{
Initp(x,y);
heavy = z;
}
void set_v()
{
int c = set_x();
int d = set_y();
cout << "Number of wheels:" << c << endl;
cout << "Vehicle weight:" << d << endl;
cout << "seating capacity:" << heavy << endl;
}
private:
int heavy;
};
派生类:从基类得到已有的属性,并自己延伸派生类;
member-specification - 访问指定符、成员对象及成员函数声明及定义的列表
如:
class Vehicle
{
public: //共有
private: //私有
protected: //保护
};
类关键 struct 和 class 在 C++ 中不可分,除了默认访问模式和默认继承模式 若类定义使用 struct 类关键则为 public ,若类定义使用 class 类关键则为 private 。 class 和 struct 均可用于类定义。
类关键 union 的定义导致联合体定义,它定义在同一时刻只保有其一个数据成员的类。
类可拥有下列类型的成员
1) 数据成员
a) 非静态数据成员,包括位域。
b) 静态数据成员
2) 成员函数
a) 非静态成员函数
b) 静态成员函数
3) 嵌套类型
a) 定义于类定义中的嵌套类及枚举
b) 既存类型的别名,以 typedef 或类型别名声明定义
c) 在类自身定义中的类名称表现为其自身的 public 成员类型别名,为了查找之便(除非在用作构造函数名时):这被称作注入类名
4) 定义于类中的所有无作用域枚举的枚举项
5) 成员模板(变量模板、 (C++14 起)类模板或函数模板)可出现于任何非局部 class/struct/union 定义体内。
成员在类定义中一次性定义,不能添加成员到已定义的类(不同于命名空间的成员)
类 T 的成员不能使用 T 作为其名,若它是静态数据成员、成员函数、成员类型、成员模板、无作用域枚举的枚举项、匿名成员联合体的成员。然而,非静态数据成员可使用名称 T ,只要无用户声明的构造函数。
声明或继承了至少一个虚成员函数的类是多态的。此类型的对象是多态对象并拥有作为其对象表示一部分存储的运行时类型信息,可以由 dynamic_cast 和 typeid 查询。虚成员函数参与动态绑定。
声明或继承了至少一个纯虚函数的类是抽象类。不能创建此类型的对象。
拥有 constexpr 构造函数的类是字面类型 (LiteralType) :此类型的对象能用 constexpr 函数在编译时操作。
一些成员函数是特殊的:某些条件下编译器定义它们,即使用户不定义。它们是:
默认构造函数
复制构造函数
移动构造函数 (C++11 起)
复制赋值运算符
移动赋值运算符 (C++11 起)
析构函数