别怕Linux编程

Google C++编程规范 – 第三十三条 -《委托构造函数和继承构造函数》

本原创文章属于《Linux大棚》博客。

博客地址为http://roclinux.cn

文章作者为roc。

==

【规范】

如果使用上述两种特性可以减少代码重复,那么就使用吧。

【何为委托构造,何为继承构造】

委托构造函数、继承构造函数是两个不同的特性,两者都是在C++11标准中引入的,在老版的C++中是不支持的。

这两个特性,都是为了降低构造函数中的代码重复度,提高构造函数的代码可维护性。

委托构造函数允许类中的一个构造函数通过初始化列表方式来调用同一个类中的另一个构造函数。例如:

//这是类X中的某个构造函数,接受的参数为字符串变量。
X::X(const string& name) : name_(name) { 
  ...
}

//下面是类X中的另一个构造函数,其不接受任何参数,
//而是通过初始化列表方式调用了上面的构造函数
X::X() : X("") { } 。

继承构造函数,是指允许一个类直接使用其父类的构造函数,就像子类可以直接使用其父类的成员函数一样。当父类有很多种构造函数时,这种用法会非常方便。我们举个例子:

class Base {
public:
  Base();
  Base(int n);
  Base(const string& s);
  ...
};

class Derived : public Base {
public:
  //我们需要重新声明一下你要使用的构造函数
  using Base::Base;  
};

当子类只需要调用父类的构造函数就能满足需求时,“继承构造函数”的特性会非常有用。

【支持者的声音】

委托构造和继承构造,都是减少冗余代码和重复代码的好办法,能提高代码的可读性。

Java语言中有委托构造函数的特性,所以Java程序员用起来会很顺手。

【反对者的声音】

委托构造函数的特性,其实可以通过辅助函数(helper function)来变相实现。

而继承构造函数在一些情况下可能也会引起混淆,比如,如果子类中新增了一个成员变量,父类的构造函数根本无法知道这一个变化,那么就可能会引发一些问题。

【结论】

如果委托构造函数和继承构造函数可以降低代码冗余度,提高代码可读性,那么可以使用它们。但是,如果你的子类中会新增成员变量的话,要格外小心。不过,如果你在子类中使用的是类内成员初始化的话,仍然可以使用继承构造函数特性,不会产生歧义和混淆。

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *