C++再学习之路(四)

1. 如果类包含内置或复合类型的成员,则该类不应该依赖于合成的默认构造函数,它应该定义自己的构造函数来初始化这些成员

2. 抑制由构造函数定义的隐式转换

  explicit 关键字只能用于类内部的构造函数声明上,在类的定义体外部所做的定义不再重复它,当构造函数声明为 explicit 时,编译器将不再使用它作为转换操作符  P394

3. 对于没有定义构造函数并且其全体数据成员均为 public 的类,可以采用与初始化数组元素相同的方式初始化其成员

struct Data {
    int ival;
    char *ptr;
};
// val1.ival =0; val1.ptr = 0
Data val1 = {0, 0};
// val2.ival = 1024;
// val2.ptr = "Anna ";
Data val2 = {1024, "Anna"};

4. 友元机制允许一个类将其对非公有成员的访问权授予指定的函数或类

  友元的声明以关键字 friend 开始,只能出现在类定义的内部,友元可以是普通的非成员函数,或定义的其他类的成员函数,或整个类  P397

5. 非 static 数据成员存在于类类型的每个对象中,不像普通的数据成员,static 数据成员独立于该类的任意对象而存在;每个 static 数据成员是与类相关联的对象,并不与该类的对象相关联;static 数据成员必须在类定义体的外部定义(正好一次),不像普通的数据成员, static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化  P401

double Account::interestRate = initRate();

6. static 数据成员的类型可以是该成员所属的类类型,非 static 成员被限定声明为其自身类对象的指针或引用  P402

7. 数据抽象是指定义数据和函数成员的能力,封装指从常规访问中保护类成员的能力,成员函数定义类的接口,通过将类的实现所用到的数据和函数设置为 private 来封装类  P403

8. 显示构造函数是指可以用单个实参调用但不能用于执行隐式转换的构造函数  P404

9. 当类具有指针成员时,需要类定义自己的复制控制成员  P406

10.直接初始化采用 ( ) ,复制初始化采用 = ;直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数  P406

11.以非引用类型作返回值时,将返回 return 语句中的值的副本,当形参或返回值为类类型时,由复制构造函数进行复制  P407

12.为了防止复制,类必须显式声明其复制构造函数为 private  P410

13.动态分配的对象只有在指向该对象的指针被删除时才撤销

  如果没有删除指向动态对象的指针,则不会运行该对象的析构函数,对象就会一直存在,从而导致内存泄漏  P413

14.合成析构函数并不删除指针成员所指向的对象,析构函数通常用于释放在构造函数或在对象生命期内获取的资源  P413

15.编写自己的复制构造函数时,必须显式地复制需要复制的任意成员,显式定义的复制构造函数不会进行任何自动复制  P417

16.即使对象赋值给自己,赋值操作符也需要正常工作,保证这个行为的通用方法是显式检查对自身的赋值  P418

17.包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针中的地址,而不会复制指针指向的对象  P419

18.智能指针类将一个计数器与类指向的对象相关联,使用计数跟踪该类有多少个对象共享同一指针  P421

19.作为类成员的重载函数,其形参看起来比操作数数目少1,作为成员函数的操作符有一个隐含的 this 形参,限定为第一个操作数  P431

20.操作符定义为非成员函数时,通常必须将它们设置为操作类的友元  P432

21.将操作符设置为类成员还是普通非成员函数的指导原则

  赋值( = )、下标、调用和成员访问箭头等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误

  像赋值一样,复合赋值操作符通常应定义为类的成员。与赋值不同的是,不一定非得这样做,如果定义非成员复合赋值操作符,不会出现编译错误

  改变对象状态或与给定类型紧密联系的其他一些操作符,如自增、自减和解引用,通常应定义为类成员

  对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为普通非成员函数  P435

22.既定义了算术操作符又定义了相关复合赋值操作符的类,一般应使用复合赋值实现算数操作符  P440

23.重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象  P445

24.C++语言不要求自增操作符或自减操作符一定作为类的成员,但是,因为这些操作符改变操作对象的状态,所以更倾向于将它们作为成员  P447

25.为了与内置类型一致,前缀式操作符应返回被增量或减量对象的引用;后缀式操作符应返回旧值(即尚未自增或自减的值),并且应作为值返回,而不是返回引用  P448

26.定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似于函数的对象  P450

27.函数适配器用于特化和扩展一元和二元函数对象

  绑定器 将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象

  求反器 将谓词函数对象的真值求反

28.转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空  P454

29.类类型转换之后不能再跟另一个类类型转换,如果需要多个类类型转换,则代码将出错  P456

30.面向对象编程基于三个基本概念:数据抽象、继承和动态绑定

  在C++ 中用类进行数据抽象,用类派生从一个类继承另一个类:派生类继承基类的成员。动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数  P471

  

原文地址:https://www.cnblogs.com/zhp218/p/8721236.html