复制构造函数问题

wind00sky 2010-11-21 12:07:02
程序如下:

// 13.1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>

using namespace std;


class SalesItem{
public:
SalesItem(): isbn(), units_sold( 0 ), revenue( 0.0 ){
}

SalesItem( string Isbn, int UnitsSold, double Revenue ) : isbn( Isbn ), units_sold( UnitsSold ), revenue( Revenue ){
}

SalesItem( string Isbn ){
cout<<"using one param function!!!!!!"<<endl;
isbn = Isbn;
}

SalesItem( const SalesItem &item ){
cout<<"copy init..."<<endl;
}

private:
string isbn;
int units_sold;
double revenue;
};


int _tmain(int argc, _TCHAR* argv[])
{
SalesItem s = string("hello");

return 0;
}



为什么这里总是不调用类的复制构造函数呢,不是应该先生成一个临时实例,然后再用复制构造函数的吗?
麻烦大家了。
...全文
287 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
whr1314520 2011-12-15
  • 打赏
  • 举报
回复
这个不是复制构造函数的问题,而是进行隐式转换,楼主可以将接受string类型的构造函数声明为explicit就会发现编译不通过。如果存在单参数的构造函数就会出现隐式转换
永远的明日 2010-11-21
  • 打赏
  • 举报
回复
别管什么复制构造函数
定义对象时 =相当于调用构造函数,哪个最佳匹配调用哪个
很明显你的右值是string类型,当然是匹配SalesItem( string Isbn )这个构造函数了
cranium 2010-11-21
  • 打赏
  • 举报
回复
应该调用
    SalesItem( string Isbn ){
cout<<"using one param function!!!!!!"<<endl;
isbn = Isbn;
}



拷贝(复制)构造函数的调用:
SalesItem item;
SalesItem other = item;

gules 2010-11-21
  • 打赏
  • 举报
回复
SalesItem s = string("hello"); // 相当于 SalesItem s(string("hello"));
因为你是在构造一个对象的初始化语句中(调用SalesItem( string Isbn )构造函数)。
peng_weida 2010-11-21
  • 打赏
  • 举报
回复
我也想知道为什么!
arong1234 2010-11-21
  • 打赏
  • 举报
回复
SalesItem( string Isbn )这个是一个完美的匹配,为什么要拷贝构造?
Csuxiaowu 2010-11-21
  • 打赏
  • 举报
回复
谁告诉你这样会调用复制构造函数了
int _tmain(int argc, _TCHAR* argv[])
{
SalesItem s = string("hello");
SalesItem other = s;//------------------------------------
return 0;
}
arong1234 2010-11-21
  • 打赏
  • 举报
回复
管那么“理论”干吗?我估计没有任何一个编译器会按照这种理论作了[Quote=引用 20 楼 wind00sky 的回复:]
引用 19 楼 honryzz 的回复:

引用 7 楼 wind00sky 的回复:
引用 1 楼 honryzz 的回复:

被编译器优化了吧.
LZ估计是在看 c++ primer....

不好意思,回复的晚了,我是在看c++ primer,感觉复制初始化和直接初始化这里有点晕



当时我看这个书的时候,也问了这个问题...结果有人告诉我是被编译器优化了..我到现……
[/Quote]
HonryZZ 2010-11-21
  • 打赏
  • 举报
回复
被编译器优化了吧.
LZ估计是在看 c++ primer....
wind00sky 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 honryzz 的回复:]

引用 7 楼 wind00sky 的回复:
引用 1 楼 honryzz 的回复:

被编译器优化了吧.
LZ估计是在看 c++ primer....

不好意思,回复的晚了,我是在看c++ primer,感觉复制初始化和直接初始化这里有点晕



当时我看这个书的时候,也问了这个问题...结果有人告诉我是被编译器优化了..我到现在也没搞明白...
[/Quote]
我刚才在linux下面试了一下,结果也是一样的,很郁闷,都不知道我想的是对的还是错的了,上面大家的回复,我也明白意思是说编译器给调用成了直接初始化,我就是不明白理论上到底是应该调用直接匹配构造还是应该是复制初始化。
HonryZZ 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wind00sky 的回复:]
引用 1 楼 honryzz 的回复:

被编译器优化了吧.
LZ估计是在看 c++ primer....

不好意思,回复的晚了,我是在看c++ primer,感觉复制初始化和直接初始化这里有点晕
[/Quote]


当时我看这个书的时候,也问了这个问题...结果有人告诉我是被编译器优化了..我到现在也没搞明白...
wind00sky 2010-11-21
  • 打赏
  • 举报
回复
而且我调用 SalesItem s = SalesItem("xxxx");也只调用了构造,没有调用复制构造函数,是不是被优化了?
gxhxlyf 2010-11-21
  • 打赏
  • 举报
回复
的伤口恢复成都市警方
qq120848369 2010-11-21
  • 打赏
  • 举报
回复
......

定义对象的同时使用=就是构造或者拷贝构造。
对象使用=就是赋值。
wind00sky 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lintaoyn 的回复:]

引用 2 楼 csuxiaowu 的回复:
谁告诉你这样会调用复制构造函数了
int _tmain(int argc, _TCHAR* argv[])
{
SalesItem s = string("hello");
SalesItem other = s;//------------------------------------
return 0;
}

又是谁告诉不会调用……
[/Quote]
我试了,我声明了没有定义复制构造函数,编译器不报错,按理说我感觉它是会调用复制构造函数的。我用的vs2008,我一会在linux下面试一下。
lintaoyn 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 csuxiaowu 的回复:]
谁告诉你这样会调用复制构造函数了
int _tmain(int argc, _TCHAR* argv[])
{
SalesItem s = string("hello");
SalesItem other = s;//------------------------------------
return 0;
}
[/Quote]
又是谁告诉不会调用复制构造函数?
你需要了解什么构造对象。
声明复制构造函数,然后不去定义它。你再看看SalesItem other = s;能不能通过编译。
没用调用复制构造函数是因为被优化。
wind00sky 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qq120848369 的回复:]

SalesItem s = string("hello"); 等效于SalesItem s("hello");
[/Quote]
那为什么 string null_book = "9-999-99999-9 "; 这个是复制初始化?
您的意思是SalesItem s = string("hello");这个是直接初始化吗?
qq120848369 2010-11-21
  • 打赏
  • 举报
回复
SalesItem s = string("hello"); 等效于SalesItem s("hello");

wind00sky 2010-11-21
  • 打赏
  • 举报
回复
大侠们快来帮帮忙哪,是不是我理解错了。
qq120848369 2010-11-21
  • 打赏
  • 举报
回复
等效就怪了.
加载更多回复(11)

65,187

社区成员

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

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