- what explicit构造函数:用单个形参的构造函数,如果加了explicit关键字,则无法完成从形参类型到该类型的一个隐式转换。
通常单个形参的构造函数应该声明为explicit,除了拷贝构造函数。不过,拷贝构造函数和赋值构造函数除非需要,一般也设为private
explicit则只能在内部声明,而不能在外部声明
声明为explicit后,尽管不能再隐式创建对象,但可以显式创建对象,例如:item.same_isbn(Sales_item(null_book))
- 类的前向声明 p374
可以声明一个类而不定义它
class Screen;
这个声明,有时称为前向声明,在程序中引入了类类型的Screen。在声明后,定义之前,类Screen是一个不完全类型,即已知Screen是一个类型,但不知包含哪些成员
不完全类型只能以有限方式使用。不能定义该类型的对象。
不完全类型只能用于定义指向该类型的指针及引用
,或者
用于声明(而不是定义)使用该类型作为参数类型或返回类型的函数
在创建类的对象之前,必须完整地定义该类。必须定义类,而不是声明类,这样,编译器就会给类的对象预定相应的存储空间。同样的,在使用引用或指针访问类的成员之前,必须已经定义类。
- static成员 p400-401
static成员不是任何对象的组成部分,所以static成员函数不能被声明为const
static不能被声明为虚函数
static数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。
(保证对象正好定义最好办法,就是将static数据成员定义放在包含类的非内联成员函数定义的文件中)
static关键字只能用于类定义体内部的声明中,定义不能标示为static
- 声明与定义的语法
类内部定义的成员函数默认为inline;如果在类外定义该类的成员函数,则只需在任意一处声明为inline
类外定义的const的成员函数,则需两处都声明为const p369
explicit则只能在内部声明,而不能在外部声明 p394
仅仅在声明的时候需要使用virtual关键字,定义时并不需要。如果一个函数在基类中被声明为virtual,那么在它所有的派生类中它都是virtual的 <<c++编程思想>>p356
- 任意存储string的size操作结果的变量必须为string:size_type类型。特别重要的是,不要把size的返回值赋给一个int变量
- string类类型和许多其他库类型都定义一些配套类型。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。它定义为与unsigned型(unsigned int 或 unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。虽然我们不知道size_type的确切类型,但可以知道它是unsigned型。