首页 > 解决方案 > C++ 为什么参数化构造函数与 char* 不同?

问题描述

我最近开始使用 C++ 类,一切都很好,直到我想创建一个带有 'char*' 参数的类。

我创建了一个默认构造函数、一个参数化构造函数、一个复制构造函数和一个析构函数。

在 int* / float 参数上对其进行了测试,并且可以正常工作。

现在我尝试切换到 char* 并且......它没有正确打印我的字符串;

有课:

class parent{

protected:

    char *username;

public:

    parent()
    {
        username=NULL;
    }


    parent(char name[10001])
    {
        int k=strlen(name);
        username = new char[k+1];
        strcpy(username, name);
    }


    parent(const parent &p1)
    {
        int k= strlen(p1.username);
        char *temp = new char[k+1];
        strcpy(temp,p1.username);

        if(username!=NULL)
            delete[] username;
        k=strlen(temp);
        username = new char[k+1];
        strcpy(username, temp);

    }

    void print()
    {
        cout << username << '\n';
    }


    ~parent()
    {
        delete[] username;
    }

};

当我像这样调用构造函数时出现问题:

char name[10001]="my name";

parent o1;
o1=parent(name);
o1.print();

但是当我这样做时似乎很好:

parent o1(name);

再次,我用 int* / float 参数测试了这个方法,没有问题。那么为什么它对 char* 的工作方式不一样呢?

标签: c++classconstructordefault-constructor

解决方案


如评论中所述,您应该首先阅读有关The rule of three 的内容。

如果一个类需要用户定义的析构函数、用户定义的复制构造函数或用户定义的复制赋值运算符,那么几乎可以肯定这三者都需要。

所以你应该自己定义一个复制赋值运算符。可以这样实现:

parent& operator= (const parent &p1)
{
    parent temp(p1);    // use copy constructor, you already defined

    std::swap(username, temp.username); // just swap our 'invalid' username with username, initialized in temp by copy constructor

    return *this;
    //  a destructor for temp is being called, which handles resourse deallocation
}

PS在 C++11 中引入移动语义后,三的规则已经过时了。现在最好实现一个移动构造函数和移动赋值运算符,除了其他的。


推荐阅读