主题:[讨论]C++之拷贝构造函数问题
最近在看C++的构造函数,析构函数,拷贝构造函数和赋值函数的相关知识,写了一个简单的string类
(1)、先请大家看看程序有什么不妥的地方没有?
(2)、程序中有些地方不明白,已经在程序中注释了,大家帮忙看看,主要是拷贝构造函数的问题?
(3)、关于拷贝构造函数,大家都是怎么理解的?
谢谢大家···
忘了,环境是 XP sp3 + VC2005
代码如下:
[code=c]
#include <iostream>
using namespace std;
class CSString
{
public:
//构造函数
CSString():str(NULL) //a
{
str = new char[1];
str[0] = '\0';
}
CSString(const char *strr):str(NULL) //b
{
if (strr == NULL)
{
str = new char[1];
str[0] = '\0';
}
else
{
size_t len = strlen(strr);
str = new char[len+1];
strcpy_s(str,len+1,strr);
}
}
//拷贝构造函数
CSString(const CSString &src) //c
{
size_t len = strlen(src.str);
str = new char[len+1];
strcpy_s(str,len+1,src.str);
}
//赋值函数
CSString &operator =(const CSString &src)
{
if (this == &src)
{
return *this;
}
delete []str;
size_t len = strlen(src.str);
str = new char[len+1];
strcpy_s(str,len+1,src.str);
return *this;
}
//析构函数
~CSString()
{
delete []str;
str = NULL;
}
//重载 + 运算符
CSString operator +(const CSString ss) const
{
CSString tmp;
delete []tmp.str;
size_t len = strlen(str) + strlen(ss.str) + 1;
tmp.str = new char[len];
strcpy(tmp.str,str);
strcat(tmp.str,ss.str);
return tmp; //调试到这里的时候调用了拷贝构造函数,这里不太明白???
}
private:
char *str;
};
int main()
{
CSString str0("西安"); //调用构造函数b
CSString str1("好地方"); //调用构造函数b
CSString str2; //调用构造函数a
str2 = str0 + str1; //先调用拷贝构造函数c(值是“好地方”,这里也不太明白??),再调用重载+,然后调用赋值函数
//这里调用了析构函数,析构赋值函数中间变量
return 0;//析构str2,str1,str0
}
[/code]
(1)、先请大家看看程序有什么不妥的地方没有?
(2)、程序中有些地方不明白,已经在程序中注释了,大家帮忙看看,主要是拷贝构造函数的问题?
(3)、关于拷贝构造函数,大家都是怎么理解的?
谢谢大家···
忘了,环境是 XP sp3 + VC2005
代码如下:
[code=c]
#include <iostream>
using namespace std;
class CSString
{
public:
//构造函数
CSString():str(NULL) //a
{
str = new char[1];
str[0] = '\0';
}
CSString(const char *strr):str(NULL) //b
{
if (strr == NULL)
{
str = new char[1];
str[0] = '\0';
}
else
{
size_t len = strlen(strr);
str = new char[len+1];
strcpy_s(str,len+1,strr);
}
}
//拷贝构造函数
CSString(const CSString &src) //c
{
size_t len = strlen(src.str);
str = new char[len+1];
strcpy_s(str,len+1,src.str);
}
//赋值函数
CSString &operator =(const CSString &src)
{
if (this == &src)
{
return *this;
}
delete []str;
size_t len = strlen(src.str);
str = new char[len+1];
strcpy_s(str,len+1,src.str);
return *this;
}
//析构函数
~CSString()
{
delete []str;
str = NULL;
}
//重载 + 运算符
CSString operator +(const CSString ss) const
{
CSString tmp;
delete []tmp.str;
size_t len = strlen(str) + strlen(ss.str) + 1;
tmp.str = new char[len];
strcpy(tmp.str,str);
strcat(tmp.str,ss.str);
return tmp; //调试到这里的时候调用了拷贝构造函数,这里不太明白???
}
private:
char *str;
};
int main()
{
CSString str0("西安"); //调用构造函数b
CSString str1("好地方"); //调用构造函数b
CSString str2; //调用构造函数a
str2 = str0 + str1; //先调用拷贝构造函数c(值是“好地方”,这里也不太明白??),再调用重载+,然后调用赋值函数
//这里调用了析构函数,析构赋值函数中间变量
return 0;//析构str2,str1,str0
}
[/code]

您所在位置: