拷贝构造函数和赋值构造函数的区别,不解之处。
class String
{
private:
char *data;
public:
String()
{
data = new char [10];
};
String(const String &);
String &operator = (const String &);
};
String::String(const String &rs)
{
if(this != &rs)
{
data = new char[10];
strcpy(this->data, rs.data);
}
//return *this;这行书上没有写,有必要用吗?
}
String &String::operator=(const String & rs)
{
if(this != &rs)
{
delete[]data;
data = new char[10];
strcpy(this->data, rs.data);
}
return *this;
}
int main(int argc, char* argv[])
{
String s1;
String s2(s1); //调用拷贝构造
String s3 = s1; //还是调用拷贝构造,为什么不调用赋值=
return 0;
}
通常拷贝和赋值构造函数都是一齐出现的,但感觉都是一样的代码,C++有必要这样做吗?
问题点数:20、回复次数:9Top
1 楼steedhorse(晨星)回复于 2005-04-05 10:16:26 得分 5
你只需要记住,在C++语言里,
String s2(s1);
String s3 = s1;
只是语法形式的不同,意义是一样的,都是定义加初始化,都调用拷贝构造函数。Top
2 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-04-05 10:16:32 得分 5
String a;
String b(a); // invoke 拷贝构造函数
String c = b; // invode 赋值构造函数Top
3 楼steedhorse(晨星)回复于 2005-04-05 10:19:16 得分 5
C++语言支持两种语法形式的初始化,就是上面的两种。
注意,
String s3 = s1;
跟
String s3;
s3 = s1;
不同。这里则是首先调用默认构造函数初始化s3,然后使用拷贝赋值从s1那里进行拷贝。而你的例子中s2和s3的构造过程都没有执行国默认构造函数。
至于为什么不同,不为什么,这就是语法,就好比循环要使用while和for,分支要使用if和switch一样,不能混用。Top
4 楼kobefly(科比--网络学习中)回复于 2005-04-05 10:21:55 得分 0
steedhorse(晨星) ( ) 信誉:119
正解
学习,我也不明白,测试了一下,是楼主说的结果
原来如此Top
5 楼langzi8818(┤天道酬勤┝爱老婆┦┷我是来学习滴┷)回复于 2005-04-05 10:40:59 得分 0
星星~~好快~Top
6 楼nickshen()回复于 2005-04-05 10:45:50 得分 5
String c = b; //也是调用拷贝构造函数
而
String c;
c = b;//这才是调用operator =
楼上有误Top
7 楼mymyal123(风之森)回复于 2005-04-05 11:00:01 得分 0
学习Top
8 楼whyglinux(山青水秀)回复于 2005-04-05 11:07:27 得分 0
>> String s3 = s1; //还是调用拷贝构造,为什么不调用赋值=
这是因为这里的“=”不是运算符。它只是一种形式上规定的分隔符。Top
9 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-04-05 11:19:59 得分 0
String c = b; //也是调用拷贝构造函数
而
String c;
c = b;//这才是调用operator =
楼上有误
=====
是嗎,學習。Top




