`
kmplayer
  • 浏览: 512664 次
  • 性别: 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+C++.doc

    17. **在operator=中检查给自己赋值的情况**:防止自我赋值可能导致的未定义行为,通常通过检查`this`是否等于`&rhs`来实现。 第四章探讨类和函数的设计与声明: 这里主要讨论的是类的设计原则,包括访问控制、...

    Effetive+STL(Word文档)

    - **条款17:使用“交换技巧”来调整过剩容量** - 当容器不再需要大量空间时,可以使用交换技巧来释放多余的空间。 - 例如,可以创建一个空容器,然后与原有容器进行交换。 - **条款18:避免使用`std::vector...

    effective stl stl 技巧

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

    Effective C++

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

    Effetive STL中文版

    - **条款4**:使用`empty()`函数代替检查`size()`是否为0,因为前者更简洁且通常更快。 - **条款5**:优先使用区间成员函数,如`std::begin()`和`std::end()`,而不是单个元素访问函数。 - **条款6**:警惕C++中...

    Effective C++学习笔记

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

    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_...

    侯捷译Scott Meyers的 More Effecitve C++

    - **Item 17: 考虑使用LAZY EVALUATION(懒惰计算法)** - 懒惰计算是一种策略,只有当结果确实需要时才进行计算。 - 这种方法可以显著减少不必要的计算,提高效率。 - **Item 18: 分期摊还期望的计算** - 通过...

Global site tag (gtag.js) - Google Analytics