Cpp Primer Plus Part6


  1. 公有继承是is-a关系,私有和保护继承是has-a关系。

  2. 友元类的声明可以在公有、私有或保护部分,其位置无关紧要。

  3. 如果某个类具有友元,那么该友元需要在该类定义之前具有完整的定义。如类A中的某个函数是类B的友元,那么类A应该在类B之前完成声明及定义。

  4. 嵌套类声明的位置决定了嵌套类的作用域,即决定了程序的哪些部分可以创建这种类的对象。

  5. 异常:

  • 调用abort()(位于<cstdlib>头文件中),当进行除以零类似的错误操作时,发送abnormal program termination。通常函数发生异常会默认调用abort().
  • 返回错误码:将结果变量作为指针参数传入函数中,函数本身返回状态码,而不再返回结果,直接将结果写入指针指向的区域即可。
  • 使用try-catch机制:使用try块标识特定的一场可能被激活的代码块,如果发生异常则通过throw来表明,然后通过catch块来捕获异常。当执行到throw语句时,程序会寻找与异常类型(如字符数组)相匹配的catch块并执行其中的命令;如果没有执行到throw语句则会跳过相应的catch块。

    int main(viod) {
        double x, y, z;
        std::cout << "Enter two numbers: ";
        while(std::cin >> x >> y) {
            try {   // try块:引发异常
                z = hmean(x, y);    
            }
            catch (const char *s) { // catch块:捕获异常
                std::cout << s << std::endl;
                std::cout << "Enter a new pair of numbers: ";
                continue;
            }
            std::cout << "Hormonic mean of " << x << " and " << y
                << " is " << z << std::endl;
            std::cout << "Enter next set of numbers <q to quit>: ";
        }
        std::cout << "Bye!\n";
        return 0;
    }
    
    double hmean(double x, double y) {
        if(x == -y)
            throw "bad hmean() arguments: x=-y not allowed";
        return 2.0*x*y/(x+y);
    }
  1. 类中先声明的成员总会先进行初始化,而和构造函数中的初始化顺序无关,也和构造函数的参数列表顺序无关。

  2. 使用私有继承,基类的公有成员和保护乘员都将成为派生类的私有成员,因而基类的方法不会成为派生对象的公有接口,但仍然可以通过派生类的成员函数来进行访问;使用公有继承,基类的公有方法将成为派生类的公有方法,可以通过派生类对象直接进行访问基类的公有成员;使用保护继承,派生类对象可以直接访问基类的公有成员,而在类内可以直接访问基类的保护成员,私有成员则需要通过基类的方法来访问。

  3. 和公有继承不同,使用私有继承时会把对象作为一个未命名的继承对象添加到类中,如果需要访问这些无名称成员,应该通过类名来表示构造函数,如成员初始化列表中使用std::string(str)而不是name(str).类似的,需要通过类名和作用域运算符来调用基类的方法。


文章作者: Vyron Su
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Vyron Su !