该调用哪个函数??
- C/C++ code
#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;
x=a; //调用复制构造函数和重载操作符
cout<<"****************************************"<<endl;
A b(a); //调用复制构造函数
cout<<"****************************************"<<endl;
A c=2; //构造一临时对象
cout<<"****************************************"<<endl;
cout<<fun(c)<<endl; //实参到形参用初始化
return 0;
}
运行结果:
构造
****************************************
构造
****************************************
初始化
=
****************************************
初始化
****************************************
构造
****************************************
初始化
2
Press any key to continue
看清楚再说话