`
kmplayer
  • 浏览: 506522 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款17:在operator=中检查是否"自己赋值给自己"

 
阅读更多
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
分享到:
评论

相关推荐

    Effective.C++.中文第二版.50条款doc文档.chm

    条款17: 在operator=中检查给自己赋值的情况 第四章 类和函数:设计与声明条款 条款18: 争取使类的接口完整并且最小 条款19: 分清成员函数,非成员函数和友元函数 条款20: 避免public接口出现数据成员 条款21: 尽...

    Effective C++ 中文版

    11. 条款11:在operator=中处理“自我赋值” - 在赋值运算符实现中需要检查自我赋值的情况,以避免诸如释放正在使用的资源这类错误。 12. 条款12:复制对象时勿忘其每一个成分 - 拷贝构造函数、赋值运算符和析构...

    Effective C++中文第三版

    12. 条款11:在operator=中处理“自我赋值” - 在实现赋值运算符时,应该检查是否为自我赋值,避免删除自身持有的资源。 - 通过对象的地址或标准库提供的比较函数来检测自我赋值。 13. 条款12:复制对象的所有...

    EffectiveC++终稿44__tagged_2019-06241

    **条款 11:在 operator= 中处理“自我赋值”** 为了防止自我赋值导致的问题,赋值运算符应首先检查左右操作数是否相等,如果是,通常只需返回一个引用即可。 **条款 12:复制对象时勿忘其每一个成分** 深拷贝和...

    高效C++:从C到C++

    **条款17:在operator=中检查给自己赋值的情况** - **背景**:赋值操作符应检查是否是对自己进行赋值。 - **原因**:自我赋值检查可以避免不必要的内存分配和释放操作,提高效率。 - **示例**: ```cpp class ...

    Effective_C++

    **条款17:在operator=中检查给自己赋值的情况** - **目的**: 避免不必要的操作。 - **解释**: 在实现赋值操作符时,需要检查是否正在对自己进行赋值操作。如果是这种情况,则可以直接返回,避免不必要的复制操作。...

    effective stl stl 技巧

    #### 条款17:使用“交换技巧”来修整过剩容量 - **核心概念**:通过交换容器内容来调整容量,以避免内存浪费。 - **应用场景**: - 在需要释放不再使用的内存时采用此技巧。 #### 条款18:避免使用vector - **...

    Effective C++

    11. **条款11:尽量不要覆盖operator=** - 如果覆盖了赋值操作符,一定要遵循“赋值运算符定律”(又称“自赋值安全”),同时确保与深拷贝和浅拷贝兼容。 12. **条款12:提供缺省参数以增加函数的灵活性** - 缺省...

    Effective C++学习笔记

    11. **在operator=中处理“自我赋值”**:自我赋值可能导致问题,因此赋值运算符应首先检查左侧对象是否等于右侧对象,以避免不必要的操作。 12. **复制对象时勿忘其每一个成分**:当类含有成员对象时,复制构造...

    effecitve C++(中文版)

    条款12建议在构造函数中优先使用初始化列表,而不是在函数体内部赋值,以减少未定义行为的可能性。条款13指出,初始化列表的顺序应当与类中成员声明的顺序一致,这有助于代码的清晰性和一致性。条款14强调了基类的虚...

    Pcre++用户手册

    在给定字符串中搜索是否符合正则表达式,返回布尔值表示是否匹配成功。 - `bool search(const std::string &stuff, int OffSet)`。指定偏移量进行搜索。 - **获取匹配结果**: - `Array *get_sub_strings()`。...

    Python3.9安装包下载,适用Macbook 10.9及以上系统。python-3.9.10-macosx10.9

    - 新增 `:=` 解构赋值操作符,也称为“walrus operator”,可以简化某些情况下的代码。 - 类型注解改进:增加了类型提示的灵活性,如对可变类型的注解。 - 优化了字典性能,特别是插入和删除操作。 - 新增 `os.cpu_...

Global site tag (gtag.js) - Google Analytics