为什么我无法使用运算符重载添加两个字符串?

时间:2014-10-30 16:27:56

标签: c++ string

实际上,我对字符串操作有很多疑问。首先, 关于使用复制构造函数进行字符串连接,我很困惑。是否需要复制构造函数,或者只需使用参数化构造函数,就可以完成。我的意思是

class string{  
    char*p;  
    int size;  
    public: string(char *a){
        size= strlen(a);  
        p=new char[size];  
        strcpy(p,a);
    }

上面的代码,动态地启动对象 如果在上面的代码中作为参数传递,指针如何工作,如果我传递char数组a [] 此外,strcpy复制string.now如果我使用运算符重载,即

string operator+(string c)    // i'm defining the function in class definition.  
{
    string t;  
    t.size=size + c.size;  
    t.p=new char[t.size];  
    strcat(t.p,c.p);
    return t;
}

我需要复制构造函数吗?为什么? 任何人都可以解释我在使用指向char的指针时实际发生的情况 其次,在main()中如果我声明了对象。写

是不对的
string ob1("Hello world");  

或者我应该继续

char *str;
str="Hello world";

Plz也指出了我的代码片段中的错误,如果有的话。当我运行程序时,它会在两者之间停止并且它承诺程序已经停止工作。
为什么这样?

1 个答案:

答案 0 :(得分:2)

  

我需要复制构造函数吗?

通常,管理资源的类确实存在,并且您应该提供一个(以及构造函数和复制赋值运算符)以使该类有用。

但是,你不应该只为这个运营商;但你的实施确实......

  

为什么?

因为您的运算符通过值获取其左侧参数,这需要将其复制。取而代之的是参考:

string operator+(string const & c) const

(两个操作数都是const是一个好主意,既可以防止意外修改,也可以允许操作符应用于常量值。

但是,如果要修复内存泄漏(通过删除析构函数中的数组),则应提供或删除复制构造函数和复制赋值运算符以避免双重删除。有关制作类型可复制的详细信息,请参阅this question

string ob1("Hello world");  

这可能会失败(使用现代编译器),因为构造函数采用非const char*,而字符串文字会衰减到const char*。您应该将构造函数参数更改为const char*以匹配(并且通常在您不需要使用它们进行修改时始终生成指针和引用const