C++调用构造函数比较依赖C++编译器:
#include <iostream>
using namespace std;
class T{
public:
T(int i){cout<<"Call T(),i="<<i<<endl;}
//explicit T(int i){cout<<"Call T(),i="<<i<<endl;}
~T(){cout<<"Call ~T()"<<endl;}
private:
int i;
};
int main(void)
{
T t1(9);//标准的初始化方式
T t2 = 9;//古老的C++编译器
T t3 = T(9);//采用默认的临时对象的拷贝构造函数初始化t3
return 0;
}
运行结果:
Call T(),i=9
Call T(),i=9
Call T(),i=9
Call ~T()
Call ~T()
Call ~T()
例如定义一个class,为T,T的构造函数只有一个int的参数,采用如下的构造方式都能正常运行:
1.T t(9);
2.T t2= 9;//不同类型哦,首先用5构造一个临时对象,然后在用临时对象对t2进行拷贝构造函数初始化.
3.T t3= T(9);//用一个T的对象初始化t3对象,C++编译器总是默认会提供拷贝构造函数,来用对象初始化同一类型的对象。
以上的三种方式都能正确的编译并且运行。
关键字explicit可以阻止让c++编译器阻止非正常的复制对对象进行初始化。如果构造函数上前加上explicit ,则在上面的T t2 = 9是编译不通过的。
例子:
<span style="font-size:24px;">perryn@:/data/source/Cpp/demo:g++ demo2.cc
demo2.cc: In function ‘int main()’:
demo2.cc:14:9: error: conversion from ‘int’ to non-scalar type ‘T’ requested
T t2 = 9;</span>
^