1、有关拷贝构造函数的说法不正确的是( )。

Jinhao 2006-04-28 12:13:03
刚才的一个帖子

我觉得的答案是:
A) 拷贝构造函数的名字和类名是一样的 [错]
B) 类中只有一个拷贝构造函数 [错]
C) 拷贝构造函数可以有多个参数 [对]
D) 拷贝构造函数无任何函数类型 [错]

...全文
1648 点赞 收藏 68
写回复
68 条回复
tianrolin 2006年04月29日
楼上几位争论的都很精彩,不过还是最欣赏鸡丁同志。
无论是Dev C++还是VC,都是允许多个拷贝构造函数和支持多参数的拷贝构造函数。ugg的小失误在于同时给其他两个拷贝构造函数提供了默认参数。
动手试一下就知道了。
回复 点赞
sms88 2006年04月29日
结贴的时候,LZ给个总结好了!
回复 点赞
toumao 2006年04月29日
我再补充一点吧:
幼学园老师问:“比1大的数是多少啊?”
小朋友会回答:“2!”

但是如果给大人回答,
要么回答:比1大的数有无穷多个,如2、3、4、5、6
要么回答:1.0000000..无穷位小数..001

那么,是幼儿园老师出题出错了吗?
不是,是你不该偏离了出题人的本意。
楼上的人在编译的角度讨论本题,就类似于这个情况。
回复 点赞
toumao 2006年04月29日
大家争得好热烈啊,其实是大家多虑了,
做题目的时候不仅要认理,还要考虑一下出题人的想法。

这个题目是给学编程的人做的,
而不是给学编译的人做的,
许多人把焦点放在编译中,就偏题了。

在通常编程教材中,拷贝构造函数的名字就是和类名一致,
楼上有人得出“构造函数没有名字”的结论,那不是出题人的本意。

类中只能有一个拷贝构造函数也是对的,
T (T&, int i=0);可以视为构造函数的一个重载,但不一定视为拷贝构造函数。
它与普通构造函数的区别就是第一个参数是同类对象实例,而不是其它类型。

认识到上面这点,那么C就不对了,因为构造函数无论重载多少个,
只有一个可以视为拷贝构造,就是只有一个参数,而且参数为同类实例的。
回复 点赞
303afei 2006年04月29日
没意思
回复 点赞
BluntBlade 2006年04月29日
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&, and either there are no other parameters or else all other
parameters have default arguments (8.3.6).106) [Example: X::X(const X&) and X::X(X&, int=1)
are copy constructors.
class X {
// ...
public:
X(int);
X(const X&, int = 1);
};
X a(1); // calls X(int);
X b(a, 0); // calls X(const X&, int);
X c = b; // calls X(const X&, int);
—end example]

摘自C++ 2003。别拿标准和编译器文档较真儿。
回复 点赞
BluntBlade 2006年04月29日
想抠字眼么?
回复 点赞
syt_912 2006年04月29日
我觉得a、c、d是对的~
回复 点赞
dch4890164 2006年04月29日

楼上的赞同.
呵呵
另外,大家说的话可真逗.
回复 点赞
xlsue 2006年04月29日
呵呵,没有注意这些东西,反正就知道是那么回事,知道怎么写就可以了
回复 点赞
division 2006年04月29日
学习学习,看来有时不能太依赖编译器....
回复 点赞
xlsue 2006年04月29日
xlsue(林歌) ( ) 信誉:100 2006-4-29 2:29:36 得分: 0

看了一下标准,的确构造函数没有名字。以前老是觉得它有名字的,和类名一样。。。
不过我觉得这个在标准中没有什么意义
睡觉去
----------------------------------------------------------------------------
晕!打错了,在编程中


回复 点赞
Ivony 2006年04月29日
因为我猜想题目的原意是:

1、有关拷贝构造函数的说法不正确的是( )。
A) 如果要自定义拷贝构造函数,则函数的名字必须和类名一致。
B) 一个类中只可以拥有一个起作用的拷贝构造函数。
C) 拷贝构造函数可以拥有一个以上的参数。
D) 拷贝构造函数不可以拥有返回值类型。
回复 点赞
庄鱼 2006年04月29日
关于 class T{
public:
T();T(T& t);T(const T& t);T(const T&t,int i=0);...};
虽然在编译时,在有些编译器上有可能通过,但是在调用时将发生冲突:
T a,
T b=a; //二义
T c(a);//二义
回复 点赞
庄鱼 2006年04月29日
作为复制构造函数在一个类中有且仅有一个,但表述方式可以是多样的。
回复 点赞
庄鱼 2006年04月29日
类中只有一个复制构造函数这一选项是正确的。
虽然C++允许这样定义复制构造函数:假设类T: T(T& src); T(const T& src); T(const T& src,int v=0);但是,所有这些构造函数不允许同时存在,因为其调用将发生二义性冲突,它们之间是排他性的而不是相容性的,因此,作为构造函数在一个类中有且仅有一个,但表述方式可以是多样的。
回复 点赞
Jinhao 2006年04月29日
>>不过我觉得这个在标准中没有什么意义

那问题就大了
class A{};

int main()
{
A a;
}
如果构造函数有名字。那么上面的代码就不能这样写了,而是必须
int main()
{
typename A a; //class A a;
}
回复 点赞
Jinhao 2006年04月29日
to Ivony
麻烦你说出题目出得烂的理由.

这个帖子让我想到了某个blog里某些回复
回复 点赞
sclzmbie 2006年04月29日
A) 拷贝构造函数的名字和类名是一样的 [对]
B) 类中只有一个拷贝构造函数 [错]
C) 拷贝构造函数可以有多个参数 [对]
D) 拷贝构造函数无任何函数类型 [对]
回复 点赞
goodluckyxl 2006年04月29日
Ivony()
题目出得烂,几个衰人胡搅蛮缠……


说的好 我话一出口就后悔了
不该发表评论 -_-!
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告