《C++ Primer Plus(第六版)》(28)(第十四章 C++中的代码重用 笔记)

来源:互联网 发布:linux的home目录 编辑:程序博客网 时间:2024/05/29 14:26

1.初始化顺序是按照类定义中的顺序的。


2.私有继承,基类的公有成员和保护成员都变成派生类的私有成员。

在不进行显式类型转换的情况下,不能将派生类的引用或指针赋给基类引用或指针。


3.保护继承,公有成员变保护成员。


4.使用using可以改变基类私有变量的访问权限

class son: private Father{public:    using Father::menber;}
不管menber是函数还是数据成员,都是写个名字就行了。不需要带其它东西。

如果有重载函数,则重载函数都可用了。

一些非常旧的版本,可能是不需要写using关键字的。


5.虚基类(Virtual base class)

跟抽象基类不是一个概念的,使用了虚函数的那个叫做抽象基类。。。

虚基类用来解决多重继承的问题。

在继承的时候跟public写在一起。

6.在多重继承中,调用构造函数的时候,子类只能够调用父类的构造函数,更上一层的祖辈类是不能显示调用的。

但是对于虚基类,是可以的,而且,在父类的构造函数中,将不再调用父类的父类的构造函数,如果不显式写明,将使用默认构造函数。

说的有点抽象。

 class A { public: A(int a) { _a = a; } int _a; }; class B :virtual public A//这里要声明虚基类,下面才能使用A的构造函数 { public: B(int a, int b) :A(a) { _b = b; } int _b; }; class C :public B { public: C(int a, int b, int c) :B(a, b), A(a)//这里的A(a),如果上面不声明了虚基类,是不能通过编译的。现在这样,B里面讲不再调用A(a)了。 { _c = c; } int _c; };

7.对于多重继承,其他方法的重复调用问题。好像没有新的语法来解决,只能通过改写代码,分拆函数功能来实现。


8.类模板的类型参数,可以提供默认值的。

template<typename T = int>class A{public:T get(){ return _a; }private:T _a;};
不过<>还是要保留的。

可以这样声明变量

A<> a


9.类模板和函数模板很相似,都可以有隐式实例化,显式实例化和显式具体化,统称具体化。

隐式实例化,就是平时使用的那些,在声明对象的时候才生成实例。

显式实例化,是声明了显式的模板实例,但是没有对象生成的。

具体化,主要是修改具体的实现方式。

模板类还允许部分具体化。

//普通模板template<typename T1, typename T2> class Pair{};//部分具体化template<typename T1> class Par<T1, int>{};
如果全部都具体化,就变成显式具体化了。

template<> class Par<int, int>{};

10.模板类的友元分为三类:

非模板友元

约束模板友元,友元的类型取决于类被实例化时的类型;

非约束模板友元,友元的所有具体化都是类的每个具体化的友元。

11.别名,C++11的东西

typedef const char* pc1;

using pc2 = const char*;

这两个语句是等价的。


12.到现在的内容,具体的说明开始越来越不重要了,关键还是多练,否则看的再多也不知道说啥。








1 0
原创粉丝点击