C++ 为什么参数化构造函数与 char* 不同?

C++ Why parameterised constructor works diffrent with char*?

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

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

在 int* / float 参数上对其进行了测试并且有效。

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

有 class :

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);

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

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

If a class requires a user-defined destructor, a user-defined copy constructor, or a user-defined copy assignment operator, it almost certainly requires all 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
}

P.S。在 C++11 中引入 move semantic 之后,三的规则已经过时了。现在最好还实现移动构造函数和移动赋值运算符,以及其他操作符。