该调用哪个函数??

一鸣惊天 2012-03-20 11:52:12


#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 为什么只用了构造函数而没有“=”或“初始化”
...全文
85 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
一鸣惊天 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pun_c 的回复:]
1.因为你的int参数的那个构造函数没有explicit来修饰,因此会隐式转换,一般这是不好的做法,构造函数最好添加上explicit
2.因为你的copy assignment函数没有用引用参数,所以要调用copy construct函数来给copy assignment的参数赋值
3. A c=2; 这个语法调用的是copy construct函数,这是C++规定的
[/Quote]

对于1 就是说在些,Dev C++不标准,对吧?
2 试了,你说的对。
3 的话如果用的是 copy construct 不是应该是“初始化”吗??怎么是“构造”
PunWinger 2012-03-21
  • 打赏
  • 举报
回复
1.因为你的int参数的那个构造函数没有explicit来修饰,因此会隐式转换,一般这是不好的做法,构造函数最好添加上explicit
2.因为你的copy assignment函数没有用引用参数,所以要调用copy construct函数来给copy assignment的参数赋值
3. A c=2; 这个语法调用的是copy construct函数,这是C++规定的
一鸣惊天 2012-03-21
  • 打赏
  • 举报
回复
得教,谢谢各位!
深圳大哥 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ri_aje 的回复:]

A c=2; 调用这个构造函数 A::A(int b=0); 不调用复制构造函数。
[/Quote]


++
深圳大哥 2012-03-21
  • 打赏
  • 举报
回复

#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

看清楚再说话
pengzhixi 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 xhxingyi 的回复:]
Dev C++ :A c=2 报错

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

dev-c++才是符合标准的,你这里必须将拷贝构造函数的参数声明const A& dev-c++才会让你通过。

A c=2;这里实际上 正常来说是 A temp(2);然后再A c=temp;这样一个过程。而这实际上是可以将这个临时对象优化的。这种优化标准是有说明的。但是优化的前提是拷贝构造函数必须符合要求,也就是说拷贝构造函数的参数类型是const A&这样才可以引用到这个临时对象temp;所以dev-c++才符合标准。
  • 打赏
  • 举报
回复

A a;//直接调用构造函数 输出 “构造”

A x;//直接调用构造函数 输出 “构造”

x=a;//调用赋值操作符,由于重载的赋值操作符函数的参数不是引用类型,那么传递参数的时候,
//要调用拷贝构造函数进行值传递,则对应的输出就是 “初始化” “=”

A b(a);//直接调用拷贝构造函数 输出“初始化”

A c=2;// 先隐式调用构造函数,再调用拷贝构造函数,但编译器进行了优化,
//你能看的的结果就是只调用了构造函数,而没调用拷贝构造函数,由于进行了优化,所以你看
// 不到调用拷贝构造函数 对应的输出只有 “构造”

cout<<fun(c)<<endl; //进行参数传递的时候是值传递,直接调用拷贝构造函数 输出“初始化”
  • 打赏
  • 举报
回复
A c=2; 先调用构造函数,生成一个临时对象,再调用拷贝构造函数,就行初始化,但编译器进行了优化,你只能看到调用了构造函数,

对于编译器来说,只有是同类型的类对象进行初始化或进行值传递或进行值返回的时候才调用拷贝构造函数,只要不是同类型的对象进行初始化,编译器就会进行优化
ri_aje 2012-03-21
  • 打赏
  • 举报
回复
A c=2; 调用这个构造函数 A::A(int b=0); 不调用复制构造函数。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧