拷贝构造函数能否重载?
如题 问题点数:20、回复次数:37Top
1 楼popy007(Twinsen)回复于 2006-03-13 12:16:03 得分 2
可以
class A {
public:
A() {}
A(const A& a) {}
A(const A& a, int) {}
};
Top
2 楼bluewindyy(班班)回复于 2006-03-13 12:21:38 得分 0
可以的Top
3 楼OnTheWayWWJ(在路上)回复于 2006-03-13 12:22:19 得分 0
可以Top
4 楼start1298(hugo)回复于 2006-03-14 11:26:50 得分 0
只要它们的参数,个数,顺序不同就可以!!!
Top
5 楼FeelingWELL(FeelingWELL)回复于 2006-03-14 13:19:53 得分 0
谢谢各位Top
6 楼danjiewu(阿丹)回复于 2006-03-14 14:26:17 得分 0
A(const A& a, int) {}
解释下这是什么意思?Top
7 楼pyrophile(豆子(天上云彩往下飘))回复于 2006-03-14 14:36:39 得分 0
A(const A& a, int) {}
等于A(const A& a, int b) {}Top
8 楼ningsheng(闲云野鹤)回复于 2006-03-14 15:03:53 得分 0
多一个参数好象就不算拷贝构造函数了Top
9 楼kunp(一天一小步)回复于 2006-03-14 16:02:19 得分 0
如果人家一定要这么用:
A a1;
A a2(a1, 2);
也是可以的Top
10 楼BluntBlade(信仰迷离·重构之道,在于Redo/Undo之间)回复于 2006-03-14 16:05:03 得分 0
“拷贝构造”的语义是什么?
“构造”的语义又是什么?Top
11 楼danjiewu(阿丹)回复于 2006-03-14 16:12:16 得分 2
如果人家一定要这么用:
A a1;
A a2(a1, 2);
也是可以的
A a2(a1, 2);
这个应该就是构造函数,而不应该叫拷贝构造函数了吧?Top
12 楼popy007(Twinsen)回复于 2006-03-14 16:26:33 得分 2
多一个参数好象就不算拷贝构造函数了
==
标准的构造函数应该是
X(const X&)
的格式,但是lz问的是“是否可以重载?”,也就是说放方法的
signature需要改变,否则怎么能叫重载?Top
13 楼yuanchuang(元创)回复于 2006-03-14 16:53:57 得分 2
重载拷贝构造函数?
不是X(const X&)格式的也能算拷贝钩造函数?
当然不能!Top
14 楼Sword_liao(Sword_liao)回复于 2006-03-14 17:14:54 得分 2
不能,拷贝构造函数格式固定.格式不一样就不是拷贝构造了Top
15 楼ugg(逸学堂(exuetang.net))回复于 2006-03-14 18:05:47 得分 2
什么是构造函数?
什么是拷贝构造函数?
构造函数能重载否?
拷贝构造函数只是带参数(参数是自身的实例)的构造函数!Top
16 楼syy6()回复于 2006-03-14 18:47:15 得分 0
那就不是拷贝构造函数了阿。Top
17 楼liuyuanxiang()回复于 2006-03-14 20:48:12 得分 0
拷贝构造函数是有且自由一个参数是自己类对象引用的函数,所以不能重载Top
18 楼toumao(偷猫)回复于 2006-03-14 20:52:55 得分 0
重载要求参数区别,
要么参数个数不同、要么类型不同、要么顺序不同,
拷贝核造函数名没法重载,
因为它的参数只有一个、而且类型确定。Top
19 楼FeelingWELL(FeelingWELL)回复于 2006-03-14 21:54:48 得分 0
拷贝构造函数的的基本形式是
<类名>::<拷贝初始化构造函数名>(const<类名>&<引用名>)
如果 const<类名> 引用的是不同的类名的话,这样算不算重载??Top
20 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-14 23:35:55 得分 3
拷贝构造函数当然可以重载
Class_Type::Class_Type( Reference_of_Class_Type)
Class_Type::Class_Type( Reference_of_Class_Type, T = object_of_T)
往往我们都是用的const T&。
T(T&);
T(const T&);
T(volatile T&);
T(const volatile T&);
除了上面的,还有就是,有更多参数的,不过其他参数都必须有默认值,例如
T(T&, int = 0);
把上面几种情况放在一起就重载了拷贝构造函数
另外
template<typename U> T(U& ); 绝对不会被当作copy constructor调用Top
21 楼yuanchuang(元创)回复于 2006-03-15 07:55:46 得分 0
T(T&);
T(const T&);
T(volatile T&);
T(const volatile T&);
会存在二义性的吧!Top
22 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-15 11:12:33 得分 0
怎么会呢?绝对不会...Top
23 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-15 11:19:39 得分 1
哦,错了,是会有二义性。问题的关键是重载Top
24 楼xiang1358(向圣海)回复于 2006-03-15 12:18:07 得分 0
指针和引用参数的const 和 volatile 可以重载的,不会有二义性的吧!!~~~~~Top
25 楼zerg_memory(小虫子)回复于 2006-03-15 17:09:37 得分 2
成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual关键字可有可无。
拷贝构造函数是符合的Top
26 楼SEUU(三枝花)回复于 2006-03-15 21:50:28 得分 0
不能重载
还有,你的分多给我一点吧,我是来得分的,我只要星星!Top
27 楼txj_killer(流浪的天行)回复于 2006-03-16 16:11:39 得分 2
#include <iostream>
using namespace std;
class A
{
public:
A(){};
A(volatile A&)
{
cout << "volatile" << endl;
}
A(const A&)
{
cout << "const" << endl;
}
A(A&)
{
cout << "common" << endl;
}
};
int main()
{
A a;
A b(a);
const A c;
A d(c);
volatile A e;
A f(e);
system("pause");
return 0;
}
这样是可以重载的,不会有二义性。
但是如果通过默认参数重载,则如果去除那个默认参数后的写法也存在的话,会出现二义性。Top
28 楼FeelingWELL(FeelingWELL)回复于 2006-03-17 11:20:13 得分 0
class A{
publc:
A(){}
A(const&a); //1
A(const&a,int); //2
...}
这个应该算重载吧?只要2中的第二个参数没有给默认值,应该不会出现二义性啊
而且也符合了重载条件了Top
29 楼txj_killer(流浪的天行)回复于 2006-03-17 11:52:46 得分 0
FeelingWELL(FeelingWELL) ( ) 信誉:100 2006-03-17 11:20:00 得分: 0
class A{
publc:
A(){}
A(const&a); //1
A(const&a,int); //2
...}
这个应该算重载吧?只要2中的第二个参数没有给默认值,应该不会出现二义性啊
而且也符合了重载条件了
______________________________________
没给默认值算重载,可惜不再是拷贝构造函数了,是否是拷贝构造函数有一个基本的要求,那就是在传值返回的时候会可能被调用到,而A(const&a,int); 这种重载显然是不可能的。Top
30 楼popy007(Twinsen)回复于 2006-03-17 12:19:02 得分 0
txj_killer(流浪的天行)
没给默认值算重载,可惜不再是拷贝构造函数了,是否是拷贝构造函数有一个基本的要求,那就是在传值返回的时候会可能被调用到,而A(const&a,int); 这种重载显然是不可能的。
==
class A {
public:
A(const A& a, int = 0) {}
};
这个可以Top
31 楼popy007(Twinsen)回复于 2006-03-17 12:36:12 得分 0
#include <iostream>
using namespace std;
class A {
public:
A() {}
A(const A& a, int = 0) { cout << "cpy-ctor\n"; }
};
void main() {
A a;
A a2(a);
}Top
32 楼BenjaminHuang(肥牛阿Ben)回复于 2006-03-17 12:51:15 得分 0
如果函数的参数本类对象引用的话还能叫做拷贝构造函数吗?Top
33 楼txj_killer(流浪的天行)回复于 2006-03-17 12:57:59 得分 0
to popy007(Twinsen):
那种情况我前面已经说过了,那样确实可以,但当同时存在A(const A& a)的时候会出现二义性。Top
34 楼fiftymetre(50米深蓝)回复于 2006-03-17 13:12:54 得分 0
prototype 模式Top
35 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-17 16:42:46 得分 0
师傅不愧为师傅呀。一来就是这么高级的应用。佩服~~Top
36 楼txj_killer(流浪的天行)回复于 2006-03-17 17:13:53 得分 0
靠,50m这不是在骗分么,bs之~~Top
37 楼wang1523(大菜鸟)回复于 2006-03-17 21:04:21 得分 0
当然了,象拥有堆变量的类对象来说,还必须有自己重载的拷贝构造函数呢Top




