C++Primer第5版读书笔记(第7章)

第7章 类
const成员函数

  • 常量成员函数不能改变调用它的对象的内容,在类外部定义时,也必须在参数列表后明确指定const属性

7.1.4 构造函数

  1. 默认构造函数,可以使用=default进行定义。和其他函数一样,如果=default在类的内部,则默认构造函数是内联的;如果它在类的外部,则该成员默认情况下不是内联的;

7.2 访问控制与封装

  1. class与struct的唯一区别为class的默认访问权限为private,而struct的默认访问权限为public;
  2. 友元可以允许其他类或函数访问该类的非公有成员,方法是令其他类或函数成为它的友元(friend);友元声明只能出现在类定义的内部,友元不是类的成员也不受它所在区域访问控制级别的约束;

7.3 类的其他特性

  1. 定义在类内部的成员函数是自动inline的,可以在类的内部把inline作为声明的一部分显式地声明成员函数,同样也可以在类的外部;
  2. 可以通过在变量的声明中加入mutable关键字使得某个数据成员在一个const成员函数内可以被修改;
  3. 类数据成员的初始值,类内初始值必须使用=的初始化形式或者花括号的直接初始化形式。
  4. 类之间的友元关系,如果类A需要访问类B中的私有成员,则须在类B中指定类A为它的友元。
class B{
    friend class A;
    ....
};

令成员函数作为友元,即可以指定A类中的成员函数为友元,每个类负责控制自己的友元类或友元函数,友元关系不存在传递性。

7.5 构造函数再探

  • 如果成员是const、引用,或属于某种未提供默认构造函数的类类型,必须通过构造函数初始值列表为这些成员提供初值。
  • 成员的初始化顺序与它们在类定义中的出现顺序一致,最好令构造函数初始值的顺序与成员声明的顺序保存一致。而且如果可能的话尽量避免使用某些成员初始化其他成员。
  • 如果一个构造函数为所有参数都提供了默认实参,则它实际上也定义了默认构造函数。
  • 当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体将先依次被执行,然后控制权才会交还给委托者的函数体。
class A{
    public:
        A(agr1,agr2,...):a(agr1),b(agr2),...{};
        A():A(agr1,agr2,...){};
}
  • 抑制构造函数定义的隐式转换,关键字explicit只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,所以无须将这些构造函数指定为explicit的,并且关键字explicit只能在类内声明构造函数时使用,在类外部定义时不应重复,explicit构造函数只能用于直接初始化;
  • 静态成员函数不与任何对象绑定在一起,它们不包含this指针。作为结果,静态成员函数不能声明成const的,并且不能在static函数体内使用this指针。
  • 当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句;
  • 一般来说,不能在类的内部初始化静态成员,但是可以为静态成员const整数类型提供类内初始值,不过要求静态成员必须是字面值常量类型的constexpr;即使一个常量静态数据成员在类内部被初始化了,通常情况下也应该在类的外部定义一下该成员。
  • 特别的,静态数据成员的类型可以就是它所属的类类型,而非静态数据成员则受到限制,只能声明成它所属类的指针或引用;
class Bar{
    public:
        static Bar mem1;    //正确:静态成员可以是不完全类型
        Bar *mem2;          //正确:指针成员可以是不完全类型
        Bar mem3;           //错误:数据成员必须是完全类型
}
  • 静态成员与普通成员的另外一个区别是可以使用静态成员作为默认实参,而非静态成员不能作为默认实参;

你可能感兴趣的:(C++,C++)