在代码开发中,C语言和C++都是基础语言,是很多web开发人员的入门级必学语言。但在C++98 中,类成员构造问题还存在一些问题,为此C++11提出了一些新特性。
  C++98中如果一个类有多个构造函数且要实现类成员构造,这些构造函数通常要包含基本相同的类成员构造代码。在坏的情况下,相同的类成员构造语句被拷贝粘贴在每一个构造函数中。
  基于C++98中的类成员构造问题,C++11新特性中,程序员可以将公有的类成员构造代码集中在某一个构造函数里,这个函数被称为目标构造函数。其他构造函数通过调用目标构造函数来实现类成员构造,这些构造函数被称为委派构造函数。在该新特性提出之前,构造函数是不能显式被调用的,委派构造函数打破了这一限制。下面小编将和大家一起来看看C++11委派构造函数的使用方法。
  1、委派构造函数的使用
  为了详细了解C++11的新特性,我们可以通过下面这个例子来看看具体是怎么使用的:
  程序源代码 (delegatingctor1.cpp)
class A{
public:
// A(int i)为 A()的委派构造函数
A(): A(0){}
// A(int i, int j)为 A(int i)的委派构造函数
A(int i): A(i, 0){}
// 委派构造链为 A()->A(int i)->A(int i, int j)
A(int i, int j) {
num1=i;
num2=j;
average=(num1+num2)/2;
}
private:
int num1;
int num2;
int average;
};
  从上面这个例子中,可以看出,在构造函数 A()的初始化列表里,程序调用了 A(0), 这是委派构造函数的语法。 我们称 A(int i)为 A()的目标构造函数,而 A()为 A(int i)的委派构造函数。同理,A(int i, int j)为 A(int i)的目标构造函数,而 A(int i) 为 A(int i, int j)的委派构造函数。在利用了委派构造函数后,整个程序变得更加的清楚和简洁。目标构造函数和委派构造函数跟其他普通的构造函数一样有相同的接口和语法,它们并没有特殊的处理和标签。通过这个例子,我们也可以看出C++11中一个委派构造函数可以是另一个委派构造函数的目标构造函数,委派构造函数和目标构造函数是相对而言的。目标构造函数是通过重载和类参数推导准则而选定的。
  在C++函数委派过程中,当目标构造函数函数执行完毕后,委派构造函数继续执行它自己函数体内的其他语句。可以通过下面这个例子的方式实现:
  程序源代码 (delegatingctor2.cpp)
#include <iostream>
using namespace std;
class A{
public:
A(): A(0){ cout << "In A()" << endl;}
A(int i): A(i, 0){cout << "In A(int i)" << endl;}
A(int i, int j){
num1=i;
num2=j;
average=(num1+num2)/2;
cout << "In A(int i, int j)" << endl;
}
private:
int num1;
int num2;
int average;
};
int main(){
A a;
return 0;
}
  该例子的输出为:
  In A(int i, int j)
  In A(int i)
  In A()