读书人

该调用哪个函数?该如何解决

发布时间: 2012-04-03 12:38:19 作者: rapoo

该调用哪个函数??

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; //进行参数传递的时候是值传递,直接调用拷贝构造函数  输出“初始化”
[解决办法]
探讨
Dev C++ :A c=2 报错

问: A c=2 C++标准是可以的,对不?
x=a 为什么除了“=”,还用了“初始化”?
A c=2 为什么只用了构造函数而没有“=”或“初始化”

[解决办法]

#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

看清楚再说话

读书人网 >C++

热点推荐