C++中string()+char的工作原理及临时对象相关疑问
嘿,这个问题问到点子上了,正好是C++里临时对象和运算符重载的经典场景,我给你一步步拆解明白:
1. 确实会调用
std::string()构造函数创建无名临时对象 string()(如果是std命名空间下的话就是std::string())就是直接调用std::string的默认构造函数,生成一个空的、无名的临时std::string实例。这个临时对象的生命周期只在当前表达式的范围内有效——简单说,就是从它被创建出来,到整个string()+'a'表达式执行完毕,之后就会被自动销毁。
2. 临时对象的数据类型就是
std::string 别想复杂了,string()构造函数返回的就是标准的std::string类型对象(如果你代码里用了using namespace std;,那就是string类型)。这个临时对象和你用std::string temp;创建的具名对象在类型和内存结构上没有任何区别,只是它没有名字,没法直接引用。
3. char拼接的逻辑:靠运算符重载实现
std::string类专门重载了operator+运算符,其中有一个重载版本的签名大概是这样的:
std::string operator+(const std::string& lhs, char rhs);
当你写string()+'a'的时候,实际发生的步骤是:
- 第一步:执行
string(),创建空的临时std::string对象; - 第二步:把这个临时对象作为
lhs参数,'a'作为rhs参数,调用上面的operator+重载函数; - 第三步:这个重载函数内部会创建一个新的std::string对象,先复制
lhs的内容(也就是空字符串),再把rhs对应的字符追加进去,最后返回这个新的字符串对象; - 第四步:原来的空临时对象完成使命,被销毁;如果这个表达式的结果没有被赋值给某个变量,那
operator+返回的新字符串也会马上被销毁。
举个实际的例子,如果你写:
std::string my_str = std::string() + 'a';
最终my_str会是一个只包含字符'a'的字符串——这里operator+返回的结果会被移动(C++11及以后)或者拷贝到my_str里,所有临时对象都会被正确清理,不会有内存泄漏的问题。
内容的提问来源于stack exchange,提问作者P.K.
相关产品推荐
相关产品推荐

