回 帖 发 新 帖 刷新版面

主题:[讨论]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]

回复列表 (共11个回复)

11 楼


自己顶一下···

而且还有一个问题是,如果要重载 >> 运算符,因为CSString类里面用的是char*类型,那么是必须得在重载函数里面分配内存,内存的大小怎么确定?

声明:
[code=c]
    friend istream& operator >>(istream&, CSString&); 
[/code]

实现:
[code=c]
istream& operator >>(istream& in, CSString& src)
{
    src.str_ = new char[100]; //必须要分配内存,多大的才合适?
    in >> src.str_;
    return in;
}
[/code]

我来回复

您尚未登录,请登录后再回复。点此登录或注册