#include <iostream>using namespace std;class A{ int i;public: A(int b=0):i(b){cout<<"构造"<<endl;} A(A &B){i=B.i;cout<<"初始化"<<endl;} A & operator=(A B){ i=B.i; cout<<"="<<endl; return *this; } int geti(){return i;}};int fun(A a){ return a.geti();}int main(){ A a; A x; x=a; A b(a); A c=2; //构造一临时对象 cout<<fun(c)<<endl; //实参到形参用初始化 return 0;}
vs2010的结果为: 构造 构造 初始化 = 初始化 构造 初始化 2
Dev C++ :A c=2 报错
问: A c=2 C++标准是可以的,对不? x=a 为什么除了“=”,还用了“初始化”? A c=2 为什么只用了构造函数而没有“=”或“初始化”
[解决办法] 1.因为你的int参数的那个构造函数没有explicit来修饰,因此会隐式转换,一般这是不好的做法,构造函数最好添加上explicit 2.因为你的copy assignment函数没有用引用参数,所以要调用copy construct函数来给copy assignment的参数赋值 3. A c=2; 这个语法调用的是copy construct函数,这是C++规定的 [解决办法] A c=2; 调用这个构造函数 A::A(int b=0); 不调用复制构造函数。 [解决办法]
C/C++ code
A a;//直接调用构造函数 输出 “构造” A x;//直接调用构造函数 输出 “构造” x=a;//调用赋值操作符,由于重载的赋值操作符函数的参数不是引用类型,那么传递参数的时候, //要调用拷贝构造函数进行值传递,则对应的输出就是 “初始化” “=” A b(a);//直接调用拷贝构造函数 输出“初始化” A c=2;// 先隐式调用构造函数,再调用拷贝构造函数,但编译器进行了优化, //你能看的的结果就是只调用了构造函数,而没调用拷贝构造函数,由于进行了优化,所以你看 // 不到调用拷贝构造函数 对应的输出只有 “构造” cout<<fun(c)<<endl; //进行参数传递的时候是值传递,直接调用拷贝构造函数 输出“初始化” [解决办法]
[解决办法]
#include <iostream> using namespace std;
class A { public: A(int b=0):i(b){cout<<"构造"<<endl;} A(A &B){i=B.i;cout<<"初始化"<<endl;} A & operator=(A B) { i=B.i; cout<<"="<<endl; return *this; } int geti(){return i;}
private: int i; };
int fun(A a) { return a.geti(); }
int main() { A a; //调用构造函数 cout<<"****************************************"<<endl;
A x; //调用构造函数 cout<<"****************************************"<<endl;