1,两个理由,赋值操作必须特别谨慎可能发生的别名问题.
(1)效率,赋值操作中,如果一开始就检测到"自己赋值给自己",可以立刻返回.
(2)assignment运算符在为其左侧对象配置新资源之前,通常必须先将原先配置给左侧对象的所有资源释放掉.
如:
String& String::operator=(const String& rhs)
{
delete [] data; // delete old memory
// allocate new memory and copy rhs's value into it
data = new char[strlen(rhs.data) + 1];
strcpy(data, rhs.data);
return *this; // see Item 15
}
考虑下面的行为:
String a = "Hello";
a = a;
结果:
2,辨识两个对象是否为同一个.
String& String::operator=(const String& rhs)
(1)数值相等,if(*this==ths)
(2)内存地址相同,if(this==&ths)
- 大小: 30.6 KB
- 大小: 27.8 KB
分享到:
相关推荐
条款17: 在operator=中检查给自己赋值的情况 第四章 类和函数:设计与声明条款 条款18: 争取使类的接口完整并且最小 条款19: 分清成员函数,非成员函数和友元函数 条款20: 避免public接口出现数据成员 条款21: 尽...
11. 条款11:在operator=中处理“自我赋值” - 在赋值运算符实现中需要检查自我赋值的情况,以避免诸如释放正在使用的资源这类错误。 12. 条款12:复制对象时勿忘其每一个成分 - 拷贝构造函数、赋值运算符和析构...
12. 条款11:在operator=中处理“自我赋值” - 在实现赋值运算符时,应该检查是否为自我赋值,避免删除自身持有的资源。 - 通过对象的地址或标准库提供的比较函数来检测自我赋值。 13. 条款12:复制对象的所有...
**条款 11:在 operator= 中处理“自我赋值”** 为了防止自我赋值导致的问题,赋值运算符应首先检查左右操作数是否相等,如果是,通常只需返回一个引用即可。 **条款 12:复制对象时勿忘其每一个成分** 深拷贝和...
**条款17:在operator=中检查给自己赋值的情况** - **背景**:赋值操作符应检查是否是对自己进行赋值。 - **原因**:自我赋值检查可以避免不必要的内存分配和释放操作,提高效率。 - **示例**: ```cpp class ...
**条款17:在operator=中检查给自己赋值的情况** - **目的**: 避免不必要的操作。 - **解释**: 在实现赋值操作符时,需要检查是否正在对自己进行赋值操作。如果是这种情况,则可以直接返回,避免不必要的复制操作。...
#### 条款17:使用“交换技巧”来修整过剩容量 - **核心概念**:通过交换容器内容来调整容量,以避免内存浪费。 - **应用场景**: - 在需要释放不再使用的内存时采用此技巧。 #### 条款18:避免使用vector - **...
11. **条款11:尽量不要覆盖operator=** - 如果覆盖了赋值操作符,一定要遵循“赋值运算符定律”(又称“自赋值安全”),同时确保与深拷贝和浅拷贝兼容。 12. **条款12:提供缺省参数以增加函数的灵活性** - 缺省...
11. **在operator=中处理“自我赋值”**:自我赋值可能导致问题,因此赋值运算符应首先检查左侧对象是否等于右侧对象,以避免不必要的操作。 12. **复制对象时勿忘其每一个成分**:当类含有成员对象时,复制构造...
条款12建议在构造函数中优先使用初始化列表,而不是在函数体内部赋值,以减少未定义行为的可能性。条款13指出,初始化列表的顺序应当与类中成员声明的顺序一致,这有助于代码的清晰性和一致性。条款14强调了基类的虚...
在给定字符串中搜索是否符合正则表达式,返回布尔值表示是否匹配成功。 - `bool search(const std::string &stuff, int OffSet)`。指定偏移量进行搜索。 - **获取匹配结果**: - `Array *get_sub_strings()`。...
- 新增 `:=` 解构赋值操作符,也称为“walrus operator”,可以简化某些情况下的代码。 - 类型注解改进:增加了类型提示的灵活性,如对可变类型的注解。 - 优化了字典性能,特别是插入和删除操作。 - 新增 `os.cpu_...