[解决办法] 如果没有explicit 那么A a = c;就相当于 A temp(c); A a=temp;再配合优化的话 可以直接是A a(c); [解决办法] 楼上说的不太对哦。 1.explicit 这个是用来指定构造函数不用来进行隐式类型转换的 2. A a = XXX这么写是会调用拷贝构造函数的。 所以正确的理解是,当你不写explicit时,编译器判断 A a = c;这句,A的拷贝构造函数是需要一个A的对象的引用的,所以进行了隐式类型转换,把c给了A的构造函数,构造出了一个临时的A对象,并将这个对象以引用的方式传入了拷贝构造函数。最后成功构造出了a。 如果你写了explicit,隐式类型转换不会被触发。所以就报错了cannot convert from 'char' to 'class A',因为你等号右边确实是个char类型的东西。 [解决办法]
A a = c; //这里编译错误:cannot convert from 'char' to 'class A', //A a(c);正常,为什么? [解决办法]
[解决办法] 没有explicit 那么A a = c;就相当于 A temp(c); A a=temp;再配合优化的话 可以直接是A a(c); 有explicit那么 A temp(c)这个就被阻止了。也就不会有A a=temp这步骤了。 [解决办法] A a = c;这种形式编译器使用构造函数A a()把c变成一个临时的A的变量,然后使用复制构造函数从新创建一个临时的对象并对其进行初始化,这样的做法付出的代价是两个构造函数以及一次析构函数,而直接使用A a(c);只付出一个构造函数的代价,所以前面那种做法完全是在浪费资源。 [解决办法] 不过有些编译器会做优化,优化之后效果一样。不做优化建议使用后面那种。 [解决办法] A a = c 就是 A a(c)。绝对不会跟operator = 扯上关系,以前没有,现在没有,将来也不会有。
[解决办法] 好多人说的差不多都对了,LZ看看《inside the c++ object model》 或者《effective C++》《more effec C++》吧! [解决办法] #include <iostream> using namespace std; class A { private:
char i;
public: A(const char c) { cout<<"构造函数"<<endl; } A() { }
~A() { cout<<"析构函数"<<endl; }
}; f(A a) { cout<<"拷贝构造函数"<<endl; } int main() { /*char c = 0;
A a = c; //这里编译错误:cannot convert from 'char' to 'class A', //A a(c);正常,为什么?*/
char c=0;
A a(c); A b=f(a);
return 0; }
[解决办法] #include <iostream> using namespace std; class A { private:
char i;
public: A(const char c) { cout<<"构造函数"<<endl; } A() { }
~A() { cout<<"析构函数"<<endl; }
}; f(A a) { cout<<"拷贝构造函数"<<endl; } int main() { /*char c = 0;
A a = c; //这里编译错误:cannot convert from 'char' to 'class A', //A a(c);正常,为什么?*/
char c=0;
A a(c); A b=f(a);
return 0; }
[解决办法] explicit就是防止 A a = c; 这种赋值发生的。 A a(c);正常,为什么?==>因为这是调用了拷贝构造函数。 [解决办法] 因为explicit抑制由构造函数定义的隐式转换,来防止在需要隐式转换的上下文中使用构造函数。
因此当你定义 char c 来为 A a赋值时,explicit阻止了将 char c转换为class A类型,因此就出错了