C++ Primer Plus(三)

完整阅读C++ Primer Plus 

  系统从新学习C++语言部分,记录重要但易被忽略的,关键但易被遗忘的。编程

 

使用类

  一、不能重载的运算符函数

 1 sizeof       sizeof运算符
 2 .            成员运算符
 3 .*           成员指针运算符
 4 ::           做用域解析运算符
 5 ?:           条件运算符
 6 typeid       一个RTTI运算符
 7 const_cast         强制类型转换运算符
 8 dynamic_cast       强制类型转换运算符
 9 reinterpret_cast   强制类型转换运算符
10 static_cast       强制类型转换运算符

  二、只能经过成员函数重载的运算符学习

1 =         赋值运算符
2 ()        函数调用运算符
3 []        下标运算符
4 ->        经过指针访问类成员的运算符

  三、关于类的类型转换函数,C++11支持对其使用explicit关键字,使其没法进行隐式类型转换。spa

  四、对于定义了一个以上的转换函数的类,编译器在某些状况下(如将一个对象直接赋值给一个基本类型,或用cout输出时)没法肯定应该使用哪个转换函数(进行隐式类型转换),所以将出现二义性错误,但只有一个转换函数时,编译器只能选择这一个,所以不会出错。指针

 

类和动态内存分配

  五、将新对象显示地初始化为现有对象时将调用拷贝构造函数,默认的拷贝构造函数将除静态成员之外的全部成员按值赋值。code

1 String a(b);
2 String a = b;
3 String a = String(b);
4 String * a = new String(b);

  将已有的对象赋值给另外一个已有的对象时,会调用赋值构造函数。对象

  六、静态成员函数不与特定的对象关联,所以只能使用静态数据成员(单例模式)。blog

  七、对于使用定位new运算符建立的对象,应显式地调用其析构函数,须要注意的是,在析构时,对象的析构顺序应该与建立顺序相反,由于晚建立的对象可能依赖于早建立的对象,另外,只有当全部对象被销毁后,才能释放存储这些对象地缓冲区。继承

  八、只有构造函数可使用初始化列表语法,对于const类成员(C++11以前)和声明为引用的类成员,必须使用这种语法,由于它们只能在被建立时初始化。内存

 

类继承

  九、 公有继承是最经常使用的继承方式,它创建一种is-a关系,即派生类对象也是一个基类对象,能够对基类对象执行的任何操做,也能够对派生类对象执行。公有继承不创建has-a关系;公有继承不创建is-like-a关系;公有继承不创建is-implemented-as-a(做为……来实现)关系;公有继承不创建uses-a关系。在C++中,彻底可使用公有继承来实现has-a、is-implemented-as-a或use-a关系,然而这样作一般会致使编程方面的问题,所以,仍是坚持使用is-a关系吧。

  十、 在基类的方法中使用关键字virtual可以使该方法在基类已经全部派生类(包括从派生类派生出来的类)中是虚的,也就是说只要函数名相同,只须要在基类中声明为虚函数,那它的派生类中,包括派生派生类中的这个函数都是虚函数,但为了可读性,通常派生类中的虚函数也用virtual声明。

  十一、若是从新定义继承的方法,应确保与原来的原型彻底相同,但若是返回类型是基类引用或指针,则能够修改成指向派生类的引用或指针,这种特性被称为返回类型协变,由于容许返回类型随类类型的变化而变化。

  十二、若是基类声明被重载了,则应在派生类中从新定义全部的基类版本,若是只在派生类中只定义了一个版本,则另外的版本将被隐藏。

  1三、C++容许纯虚函数有定义,但不能在类内定义,能够在实现文件中定义。

  1四、当基类和派生类都为至少一个成员采用了动态内存分配时,派生类的析构函数,拷贝构造函数,赋值构造函数都必须使用相应的基类方法来处理基类元素。对于析构函数,这是自动完成的;对于拷贝构造函数,是经过初始化列表中调用积累的拷贝构造函数完成的;对于赋值构造函数是经过使用做用域解析运算符显示地调用基类的赋值构造函数完成的。

  1五、当派生类的友元函数须要访问基类中的非公有成员时,作法是在派生类的友元函数中将派生类的引用强制类型转换为基类的引用。

 

C++中的代码重用

  1六、当类的初始化列表包含多个项目时,这些项目的初始化顺序为声明它们的顺序,而不是他们在初始化列表中的顺序,若是代码使用一个成员的值做为另外一个成员初始化表达式的一部分时,初始化顺序就须要引发注意。

  1七、在继承时,private是默认值,所以忽略访问限定符也将致使私有继承。

  1八、在私有继承时,访问基类方法,须要使用类名加做用域解析运算符访问;访问基类对象(例如将基类对象看成返回值时),能够将派生类强制类型转换为基类;访问基类友元函数时,由于友元函数不属于成员函数,所以不能显式地限定函数名去访问,能够经过显式地转换为基类来调用正确的函数。

  1九、一般,应该使用包含来创建has-a关系,若是新类须要访问原有类的保护成员,或须要从新定义虚函数,则应使用私有继承。

  20、对于指向对象的类或引用中的隐式向上转换,公有继承直接支持,保护继承只在派生类中支持,私有继承不支持。

  2一、若是要使私有继承的基类中的私有函数能够在派生类外访问,能够声明一个公有函数,再去调用基类的私有函数,另外还可使用using声明:

1 class A:private B
2 {
3 public:
4     using B:foo; // 只须要有函数签名便可,全部重载版本均可以使用
5 }

  另外一种老式的方法是将基类方法名放在派生类的共有部分。

  2二、在多重继承中,若是出现了菱形继承,顶端的基类应该使用虚继承,防止底端的派生类包含两份基类,同时,在构造函数的初始化列表里应该显式地调用顶端基类的构造函数,对于虚基类必须这样作,不然将使用虚基类的默认构造函数,而且此时的虚基类没法经过中间的派生类去完成构造,但对于非虚基类,这是非法的。

  2三、在混合使用虚基类和非虚基类,类经过多条虚途径和非虚途径继承某个特定的基类时,该类将包含,一个表示全部的虚途径即基类子对象和分别表示各条非虚途径的多个基类子对象。

  2四、使用非虚基类时,二义性的规则很简单,只要类从不一样类那里继承了同名的成员,使用时没有用类名限定,则必定会致使二义性,但虚基类时不必定会致使二义性,若是某个名称优先于其余名称,则使用它。优先的规则是,派生类中的名称优先于直接或间接祖先类中的相同名称。

  2五、有间接虚基类的派生类包含直接调用间接基类构造函数的构造函数,这对于间接非虚基类是非法的。

  2六、 在类模板中,模板代码不能修改参数的值,也不能使用参数得地址,在实例化时,用做表达式参数的值必须是常量表达式。

  2七、使用关键字template并指出所需类型来声明类时,编译器将生成类声明的显式实例化,声明必须位于模板定义所在的命名空间中。

  2八、C++容许部分具体化:

1 template <class T1, class T2> class Pair{};  // 通常版本
2 template <class T1> class Pair<T1, int>{};    // 部分显式具体化版本

  template后的<>中是没有被具体化的参数,若是指定全部的类型,template后的<>将为空,这会致使显式具体化。

  2九、若是有多个版本能够选择,编译器将选择具体化最高的版本,部分具体化特性使得可以设置各类限制。

1 template<T> class Feeb{};
2 template<T*> class Feeb{}; // 也能够为指针提供特殊版原本部分具体化
3 
4 template<class T1, class T2, class T3> class Trio{}; //通常版本
5 template<class T1, class T2> class Trio<T1, T2, T2>{}; // 使用T2设置T3
6 template<class T1> class Trio<T1, T1*, T1*>{}; // 使用T1的指针来设置T2和T3

  30、较老的编译器不支持模板成员,而另外一些编译器支持模板成员,可是不支持在类外面的定义。若是支持类外定义,则必须经过做用域解析运算符指出是哪一个类的成员,而且使用嵌套模板的声明方式。

1 template<typename T>
2 template<typename V>  // 嵌套方式  

  3一、 对于模板类的非模板友元函数,它不是经过对象调用的,由于它不是成员函数,它能够访问全局对象,可使用全局指针访问非全局对象,能够建立本身的对象,能够访问独立于对象的模板类静态数据成员。

  3二、在声明模板类的约束模板友元函数(友元函数也是模板函数)时,须要在类中声明具体化的友元函数,同时也须要在类外声明而且给出友元函数的定义。

  3三、除了使用typedef对模板进行重命名,C++11新增了别名

1 template<typename T>
2 using arrtype = std::array<T,12>;
3 arrtype<int> days;

  这种语法也适用于非模板,用于非模板时,它和typedef等价。

相关文章
相关标签/搜索