c++ - 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* 的工作方式不一样呢?
解决方案
如评论中所述,您应该首先阅读有关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 中引入移动语义后,三的规则已经过时了。现在最好实现一个移动构造函数和移动赋值运算符,除了其他的。
推荐阅读
- java - Android Studio 日期选择器缺少选择问题
- python - 如何运行主连接和应用程序。一起跑?
- sql-server - .NET IsolationLevel ReadCommitted 事务导致重复标识符
- typescript - 为什么 gridsome-plugin-typescript 会导致 UnhandledPromiseRejection 警告?
- vim - 语法突出显示不适用于“.txt”文件
- python - Python3 虚拟环境不使用全局安装的 pip 版本
- omnet++ - 如何在 Vanet 中的特定节点之间建立通信?
- python - VS Code 和 Django:发生异常:ImportError
- python - 计算具有相同值的numpy数组中值的(部分)邻居
- html - html/scss - 滑出式菜单直到某一点才影响内容块