c++ - 为什么要为单个赋值操作调用复制构造函数和重载赋值运算符?
问题描述
我正在用 C++ 编写一个 String 类,但是当我看到重载的构造函数和重载的赋值运算符被单个赋值操作调用时,我感到很困惑。我在想,在 b = "Check" 行中,首先将字符串转换为字符串对象,因此调用了重载的构造函数,然后调用了重载的赋值运算符。
String::String(const char* s)
{
cout << "Overloaded Constructor::String\n";
if (s != NULL)
{
size = strlen(s);
bufferPtr = new char[size+1];
strcpy(bufferPtr,s);
}
else
{
bufferPtr = NULL;
size = 0;
}
}
String & String::operator=(const String&rhs)
{
cout << "Operator=::String\n";
if (this != &rhs) // check same assignment
{
size = rhs.size;
delete [] bufferPtr;
if(rhs.size != 0)
{
bufferPtr = new char[rhs.size+1];
strcpy(bufferPtr,rhs.bufferPtr);
}
else bufferPtr = NULL;
}
return *this;
}
String a = "FName";
String b("LUsama");
b = "Check";
`
Output:
Overloaded Constructor::String
Overloaded Constructor::String
Overloaded Constructor::String
Operator=::String
解决方案
好吧,走着瞧...
a
构造函数b
构造函数- 临时对象构造函数(包含“检查”字符串)
b
通过运算符分配临时对象
正如输出所示。什么让你困惑?
推荐阅读
- java - 如何在 JFreeChart 中单击并输出 Y 值 [在我的情况下为价格]?
- graphql - 我的反应变量不会更新(阿波罗客户端)
- c# - 如何仅在 Word 表格单元格中选择文本
- android - 在 Kotlin 改造中调用函数作为发送参数的问题
- discord.js - 我将如何获取 30 天前的旧嵌入消息并结合这些值 [Discord.js V12]
- python - 我怎么能用图像添加这些按钮?
- git - 在早期 git commit 中撤消对单个文件的修改?
- google-apps-script - 您无法删除工作表 Google Sheets Script 上的所有行
- html - 使用 CSS 选择器 .last-child :在不处理面包屑之后
- vue.js - 在 vuejs 中传递值?