struct和class都是类,在一个项目中,将所有的class替换成struct,依旧可以正常运行。其最本质的区别就是,struct默认访问控制是public,class默认访问控制是private。还有一点区别就是:"class"这个关键字还用于定义模板参数,就像"typename",但关键字"struct"不用于定义模板参数。
通常情况下,struct应该被看成是一个数据结构的实现体,class应该被看成一个对象的实现体。
7.1.2
this
this是成员函数额外的隐式参数,其类型是CType *const this,是一个常量指针,不允许改变this中保存的地址。
const
string isbn() const {return bookNo;}; //常量成员函数
在此处const的作用是修改隐式this指针的类型。使之便为const CType *const this,从向量指针,设置成指向常量的常量指针。这样的成员函数叫做常量成员函数。
常量成员函数不能改变调用它的对象的内容。
7.1.4 构造函数
构造函数不能声明成const的。
如果没有显式定义构造函数,编译器就会隐式定义一个默认构造函数,又被称为合成的默认构造函数。默认构造函数将按照如下规则初始化类的数据成员:
- 如果存在类内的初试值(struct中可以指明初始值),则初始化。
- 否则,默认初始化成员。
一旦定义了其他的构造函数,编译器将不生成默认构造函数。除非再定义个默认构造函数。
对于有些数据成员,比如数组指针,默认初始化之后将是未定义的值。没有提供默认构造函数类内成员,将无法执行默认初始化。
自定义默认构造函数:
ClassType() = default;
构造函数初始值列表:
ClassType(int p1, int p2):a1(p1),a2(p2) {}
warming
有些编译器不支持雷内成员的初值,这样只能在构造函数中给初始化。
7.2.1
友元(friend)
类可以允许其他类或者函数访问他的非公有成员,方法是令其他类或者函数成为它的友元。
令外部函数作为友元,直接在类内部声明函数,前置friend
令其他类作为友元,在此类内:friend class ClassType;
令成员函数作为友元,在此类内:friend class ClassType::Function();
7.3
令成员作为内联函数
定义在类内部的成员函数默认是inline的,外部需要显式指出
重载成员函数
可变数据成员
变量声明前加入mutable关键字,这样即使在const函数中,也可以修改此成员变量。
7.5.2 委托构造函数
class CType { public: CType(string s){}; //委托构造函数 CType():CType("asdf"){}; };
7.5.4 隐式类类型转换
若构造函数只接受一个实参,则它定义了这个实参类型向这个类类型转换的隐式转换机制。这种构造函数叫做转换构造函数。
为了抑制这种转换,可以在构造函数前声明为:explicit
7.5.5 聚合类
- 所有成员public
- 没有构造函数
- 没有类内初始值
- 没有积累,没有virtual函数
这样就可以提供一个花括号初始值列表,初始化聚合类的数据成员。
Data val1 = {0, "adsf"};