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 之后,三的规则已经过时了。现在最好还实现移动构造函数和移动赋值运算符,以及其他操作符。
我最近开始使用 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 之后,三的规则已经过时了。现在最好还实现移动构造函数和移动赋值运算符,以及其他操作符。