7.类
定义在类内部的函数是隐式的inlibe函数
常量对象,以及常量对象的引用或指针都只能调用常量成员函数
一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件内
只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数
如果类包含有内置类型或者符合类型的成员,只有这些成员全部被赋予了类内的初值时,这个类才适合于使用合成的默认构造函数
构造函数不应该轻易覆盖掉类内的初始值,除非新赋的值与原值不同。如果你不能使用类内初始值,则所有构造函数都应该现式地初始化每个内置类型成员
一般来说,最好在类定义开始或结束前的位置集中声明友元
当我们提供一个类内初始值时,必须以符号=或者花括号表示
一个const成员函数如果以引用的形式返回*this,那么它的返回类型将是常量引用
即使两个类的成员列表完全一致,它们也是不同的类型。对于一个类来说,它的成员和其他任何类(或者任何其他作用域)的成员都不是一回事儿
每个类负责控制自己的友元类或者友元函数
编译器处理完类中的全部声明后才会处理成员函数的定义
类型名的定义通常出现在类的开始处,这样就能确保所有使用该类型的成员都出现在类名的定义之后
尽管类的成员被隐藏了,但我们仍然可以通过加上类的名字或现式地使用this指针来强制访问成员
如果成员是const、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值
最好令构造函数初始值的顺序与成员声明的顺序保持一致。而且如果可能的话,尽量避免使用某些成员初始化其他成员
如果一个构造函数为所有参数都提供了默认实参,则它实际上也定义了默认的构造函数
能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则
当我们用explicit关键字声明构造函数时,它将只能以直接初始化的形式使用。而且编译器将不会在自动转换过程中使用该构造函数
和类的所有成员一样,当我们指向类外部的静态成员时,必须指明成员所属的类名。static关键字则只出现在类内部的声明语句中
要想确保对象只定义一次,最好的办法是把静态数据成员的定义与其他非内联函数的定义放在同一个文件中
即使一个常量静态数据成员在类内部就被初始化了,通常情况下也应该在类的外部定义一下该成员
定义在类内部的函数是隐式的inlibe函数
常量对象,以及常量对象的引用或指针都只能调用常量成员函数
一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件内
只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数
如果类包含有内置类型或者符合类型的成员,只有这些成员全部被赋予了类内的初值时,这个类才适合于使用合成的默认构造函数
构造函数不应该轻易覆盖掉类内的初始值,除非新赋的值与原值不同。如果你不能使用类内初始值,则所有构造函数都应该现式地初始化每个内置类型成员
一般来说,最好在类定义开始或结束前的位置集中声明友元
当我们提供一个类内初始值时,必须以符号=或者花括号表示
一个const成员函数如果以引用的形式返回*this,那么它的返回类型将是常量引用
即使两个类的成员列表完全一致,它们也是不同的类型。对于一个类来说,它的成员和其他任何类(或者任何其他作用域)的成员都不是一回事儿
每个类负责控制自己的友元类或者友元函数
编译器处理完类中的全部声明后才会处理成员函数的定义
类型名的定义通常出现在类的开始处,这样就能确保所有使用该类型的成员都出现在类名的定义之后
尽管类的成员被隐藏了,但我们仍然可以通过加上类的名字或现式地使用this指针来强制访问成员
如果成员是const、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值
最好令构造函数初始值的顺序与成员声明的顺序保持一致。而且如果可能的话,尽量避免使用某些成员初始化其他成员
如果一个构造函数为所有参数都提供了默认实参,则它实际上也定义了默认的构造函数
能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则
当我们用explicit关键字声明构造函数时,它将只能以直接初始化的形式使用。而且编译器将不会在自动转换过程中使用该构造函数
和类的所有成员一样,当我们指向类外部的静态成员时,必须指明成员所属的类名。static关键字则只出现在类内部的声明语句中
要想确保对象只定义一次,最好的办法是把静态数据成员的定义与其他非内联函数的定义放在同一个文件中
即使一个常量静态数据成员在类内部就被初始化了,通常情况下也应该在类的外部定义一下该成员