为什么复制构造函数申明为私有的且没有定义还是可以复制?

showming 2010-03-28 10:53:38
#include <iostream>

class a
{
int i;

private:
a(a& other);

public:
a(int j);
};
a::a(int j){i=j;}

int main()
{
a x=1;\\这里仍然可以正常复制,程序可以执行。

return 0;
}
...全文
146 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2010-03-28
  • 打赏
  • 举报
回复
gcc好像a(a& other)设成public也是出错,还需要定义a(void)...
Vegertar 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 showming 的回复:]



就是说这和编译器有关了?我用的是VC6.0
[/Quote]

ok! in my compiler, g++4.2.1, the message returns:
---------------------------------------------------------
temp.cpp: In function 'int main()':
temp.cpp:4: error: 'A::A(const A&)' is private
temp.cpp:11: error: within this context
temp.cpp:4: error: 'A::A(const A&)' is private
temp.cpp:11: error: within this context
temp.cpp:11: error: initializing temporary from result of 'A::A(int)'
Vegertar 2010-03-28
  • 打赏
  • 举报
回复
private:
A(const A&); // disallow copy with parameter type constant reference
ShineShineRedStar 2010-03-28
  • 打赏
  • 举报
回复
a x=1, y=2; // 调用的是构造函数;
x=y; // 这个时候才去调复制构造函数,即使你不定义复制构造函数也可以用,编译器会提供合成的版本。
showming 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 milkylove 的回复:]

引用 7 楼 showming 的回复:

引用 2 楼 cattycat 的回复:

a x=1;
这个调用的不是拷贝构造函数,就是调用的构造函数,只不过是进行了隐式的转换,如果你在你把你的构造函数声明改成
explicit a(int j);
就不同编译通过了。


这里使用了“=”说明是复制初始化,而复制初始化不是一定会调用复制构造函数的吗?


用"="不一定是……
[/Quote]
如果这样编译可以通过,岂不是说明无法实现禁止复制了,那编译器又是如何实现输入输出流的复制控制的呢?
失落的凡凡 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 showming 的回复:]

引用 2 楼 cattycat 的回复:

a x=1;
这个调用的不是拷贝构造函数,就是调用的构造函数,只不过是进行了隐式的转换,如果你在你把你的构造函数声明改成
explicit a(int j);
就不同编译通过了。


这里使用了“=”说明是复制初始化,而复制初始化不是一定会调用复制构造函数的吗?
[/Quote]

用"="不一定是复制初始化
showming 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 eatsweetpotato 的回复:]

C++ primer上还有一句话:
“支持初始化的复制形式主要是为了与C的用法兼容,当情况许可时,可以允许编译器跳过复制构造函数直接创建对象,但编译器没有义务那么做。”


a x=1;
这种形式的优化结果就是直接调用构造函数而省去了复制构造
[/Quote]

就是说这和编译器有关了?我用的是VC6.0
showming 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cattycat 的回复:]

a x=1;
这个调用的不是拷贝构造函数,就是调用的构造函数,只不过是进行了隐式的转换,如果你在你把你的构造函数声明改成
explicit a(int j);
就不同编译通过了。
[/Quote]

这里使用了“=”说明是复制初始化,而复制初始化不是一定会调用复制构造函数的吗?
eatsweetpotato 2010-03-28
  • 打赏
  • 举报
回复
C++ primer上还有一句话:
“支持初始化的复制形式主要是为了与C的用法兼容,当情况许可时,可以允许编译器跳过复制构造函数直接创建对象,但编译器没有义务那么做。”


a x=1;
这种形式的优化结果就是直接调用构造函数而省去了复制构造
guoxm88 2010-03-28
  • 打赏
  • 举报
回复
#include <iostream>

class a
{
int i;

private:
a(a& other);

public:
a(int j);
};
a::a(int j){i=j;}

int main()
{
a x=1;\\这里仍然可以正常复制,程序可以执行。

return 0;
lirg8405 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 showming 的回复:]
引用 1 楼 lirg8405 的回复:

a x=1;\\这里仍然可以正常复制,程序可以执行。
这个不是调用拷贝构造函数,而是调用a(int j);
这个构造函数

不是先调a(int j)产生临时对象,然后调用复制函数初始化x为临时对象的副本?C++ primer里面就是
这样解释的啊?
[/Quote]
对于调用拷贝构造函数的就是这样的过程
showming 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lirg8405 的回复:]

a x=1;\\这里仍然可以正常复制,程序可以执行。
这个不是调用拷贝构造函数,而是调用a(int j);
这个构造函数
[/Quote]
不是先调a(int j)产生临时对象,然后调用复制函数初始化x为临时对象的副本?C++ primer里面就是
这样解释的啊?
cattycat 2010-03-28
  • 打赏
  • 举报
回复
a x=1;
这个调用的不是拷贝构造函数,就是调用的构造函数,只不过是进行了隐式的转换,如果你在你把你的构造函数声明改成
explicit a(int j);
就不同编译通过了。
lirg8405 2010-03-28
  • 打赏
  • 举报
回复
a x=1;\\这里仍然可以正常复制,程序可以执行。
这个不是调用拷贝构造函数,而是调用a(int j);
这个构造函数
na2650945 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 eatsweetpotato 的回复:]
C++ primer上还有一句话:
“支持初始化的复制形式主要是为了与C的用法兼容,当情况许可时,可以允许编译器跳过复制构造函数直接创建对象,但编译器没有义务那么做。”


a x=1;
这种形式的优化结果就是直接调用构造函数而省去了复制构造
[/Quote]

学习啦。
ithiker 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shineshineredstar 的回复:]
a x=1, y=2; // 调用的是构造函数;
x=y; // 这个时候才去调复制构造函数,即使你不定义复制构造函数也可以用,编译器会提供合成的版本。
[/Quote]
我觉得是:
a x= 1, y=2;//调用拷贝(复制)构造函数
x=y;//是调用了赋值操作符=

64,654

社区成员

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

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