繁体   English   中英

C ++复制构造函数未调用(编译错误)

[英]C++ copy constructor is not invoking (compilation error)

这段代码无法编译(请忽略operator +中的按值传递,我可以用引用替换它,但仍不能解决问题),我在主要功能中期望:

String s3 = s + s2; // COMPILATION ERROR

可以正常编译(因为我声明了复制构造函数),但给出了错误(“没有匹配的构造函数”)

#include <iostream>
#include <string>


class String {
public:
    String()
    {
        std::cout << "Constructor " << this << std::endl;
        data = new char[100];
    };

    String(char * str) : String()
    {
        std::cout << "Char * Constructor " << this << std::endl;
        strcpy(this->data,str);
    };

    String(String & rhs) : String() {
        std::cout << "Copy Constructor " << this << std::endl;
        strcpy(data, rhs.data);

    };


    void print() {
        printf("%s\n",data);
    }

    ~String() {
        std::cout << "Destructor " << this << std::endl;

        if (data) {
            delete data;
            data = nullptr;
        }
    };
    friend String operator+(String s1, String s2);

private:
    char * data;
};

String operator+(String s1, String s2)
{
    String temp;
    delete [] temp.data;
    temp.data =
    new char[strlen(s1.data) + strlen(s2.data) + 1];
    strcpy(temp.data, s1.data);
    strcat(temp.data, s2.data);
    return temp;
}


int main(int argc, const char * argv[])
{
    String s("herer");
    s.print();
    String s2 = s;
    s2.print();
    String s3 = s + s2; // COMPILATION ERROR
    return 0;
}

复制构造const&的参数必须为const&

String(String const & rhs) : String() { ... }

您的代码有几个错误。 第一

String(char * str)

需要是

String(const char * str)

如果要像在main()使用String s("herer");来使用字符串文字String s("herer"); 其次,您的副本构造函数

String(String & rhs)

需要采取

String(const String & rhs) 

这样它可以绑定到临时对象。

第三,您需要包括<cstring><string.h>才能使用strcpy()

最后,您在析构函数中使用了错误的delete 调用new ,使用delete ;使用new[] ,调用delete [] 您使用new[]分配data但是正在使用delete删除它。

您可以在此处查看代码的有效示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM