相关推荐
-
【c++编程思想学习笔记】operator=为何要检查自赋值的解答
做类似下面的事时,就会发生自己给自己赋值的情况: class X { ... }; X a; a = a; // a赋值给自己 复制代码 这种事做起来好象很无聊,但它完全是合法的,所以看到程序员这样做不要感到丝毫的怀疑。更重要的是,给自己赋值的情况还可以以下面这种看起来更隐蔽的形式出现: a = b; 如果b是a的另一个名字
-
关于对象的自我赋值行为
所谓的自我赋值,指得就是一个对象赋值给自己的简单行为,但这种看起来人畜无害动作,在某些情形下却可能会使得你的代码崩溃。自我赋值的语句,就像这样:Widget w;w = w;很明显,这是一段愚蠢的代码。但既然我们提到自我赋值会引发问题,那我们先来澄清一下自我赋值的情况其实有时并不是那么显而易见的,并不一定都像上述代码那么愚蠢,它们还可能是这样:a[i] = a[j];*px...
-
Effective_C++:17、在operator=中检查是否“自己赋值给自己”
17、在operator=中检查是否“自己赋值给自己” 1、为何检查是否“自己赋值给自己” 在使用赋值操作符时,我们只要求调用的对象类型、参数类型正确即可。所以,自己赋值给自己是完全合法的,如可能将一个对象的别名作为另一个对象赋值给这个对象。发生自己赋值给自己,可能会发生一些问题,为此,我们需要检查是否“自己赋值给自己”。 1.为了确保正确性。使用赋值操作符给左边的对象配置新资源时,可能需要...
-
《Effective C++》学习笔记(条款11:在operator=中处理“自我赋值”)
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! “自我赋值”的意思是自己给自己赋值,如: class Widget{...}; Widget w; w = w; //自己给自己赋值 这看起来很蠢,但它合法,所以不要认为它不会发生,此外,赋值动作并不会被你一眼看出来(如w = w;),例如: Widget arr[10] = {...}; arr[i] = arr[j]; //潜在的自我赋值,arr[i]和arr[j]存储同一个
-
C/C++编程:在operator=中处理自我赋值
"自我赋值"发生在对象被赋值给自己时: classs Widget{}; ... w = w; // 自我赋值 a[i] = a[j]; // 如果i和j有相同的值,自我赋值 *px = *py; // 如果px和py指向相同的东西,自我赋值 上的的后两行是"别名"带来的结束:所谓别名就是"有一个以上的方法指称某对象"。一般而言如果某段代码操作引用或者指针而它们被用来"指向多个相同类型的对象",就需要考虑这些对象是否为同一个。实际上两个对象只要来自同一个继承体系,它们甚至不需要声明
-
Effective C++条款11:在operator=中处理“自我赋值”
一、自我赋值的演示案例 自我赋值会发生在很多情况下 例如定义一个类对象,将自己赋值给自己 class Widget{}; Widget w; w = w; //自我赋值 如果下面的a是一个数字,且索引i和j相等,那么也是一个潜在的自我赋值 a[i] = a[j]; 例如下面两个指针px和py指向于同一块内存,那么也是一个潜在的自我赋值 *px = *py; 二、一个自我赋值产生的错误 下面建立一个类Widget,其中有一个指针指向一块动态分配的位图 ..
-
C++ 重载运算符“=”检测自赋值
重载赋值运算符 赋值运算符可能是最容易令人迷惑的一个,所以,重载它必须十分的小心。 1. 值运算符仅能重载为成员函数。 C++不允许赋值运算符被重载为全局形式,这是因为如果可以写出全局形式的赋值运算符函数的话,我们可以写出这样的函数: iint operator=(int a, integer b); 从而出现这样无法无天的语句: integer a(3);
-
条款 17: 在 operator=中检查给自己赋值的情况
自己给自己赋值的情况: class X { ... }; X a; a = a; // a 赋值给自己 另一种给自己赋值的情况: a = b; 如果 b 是 a 的另一个名字(例如,已被初始化为 a 的引用),那这也是对自己赋值。 在赋值运算符中要特别注意可能出现别名
-
实现=操作符时判断自己给自己赋值
// 忽略了给自己赋值的情况 // 的赋值运算符 string& string::operator=(const string& rhs) { delete [] data; // delete old memory // 分配新内存,将rhs的值拷贝给它 data = new char[strlen(rhs.data) + 1]; strcpy(data,
-
C++经验(五)--在赋值操作中处理自我赋值和令其返回指向 *this 的引用
我们经常为了方便和偷懒,将内置类型的赋值操作可以写成链式操作。 int x, y, z; x = y = z = 10; 同样地,我们曾经写过的实现,strcpy,strcat等这些函数,总是会返回一个指针。返回指针的目的也是为了方便我们进行链式操作。 char* mystrcpy(const char* src, char* dst) { assert(src != NULL && dst != NULL); if(*src == *dst) { return dst; }
-
在赋值运算符中处理自我赋值问题
自我赋值发生在对象被赋值给自己时,例如: val = val; vec[i] = vec[j];//潜在的自我赋值(i=j) *p = *q;潜在自我赋值 class A { A& operator=(const A& rhs)//不安全的赋值版本 { delete p;//停止使用当前的对象 p = new P(rhs.p);//使...
-
条款十七: 在operator=中检查给自己赋值的情况
在赋值运算符中要特别注意可能出现别名的情况,其理由基于两点。其中之一是效率。如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回,从而可以节省大量的工作,否则必须去实现整个赋值操作。 另一个更重要的原因是保证正确性。一个赋值运算符必须首先释放掉一个对象的资源(去掉旧值),然后根据新值分配新的资源。在自己给自己赋值的情况下,释放旧的资源将是灾难性的,因为在分配新的资源时会需要旧的资源...
-
String类赋值的理解
String str = “123”; str = "abc"; 怎么理解以上代码? 先看下下这个例子 int a = 5; a = 4; 这段代码的意思是,申请一个内存单元,命名为a,同时把5存到内存单元,然后又把4存到内存单元内,也就是说现在名为a 的内存单元的内容在被重新赋值后修改了 String str = “123”; str = "abc"; 这段代码可以这样
-
effect C++ 在operatro = 中处理“自我赋值”
摘自《effect c++》
-
条款17:在operator=中检查是否"自己赋值给自己"
1,两个理由,赋值操作必须特别谨慎可能发生的别名问题. (1)效率,赋值操作中,如果一开始就检测到"自己赋值给自己",可以立刻返回. (2)assignment运算符在为其左侧对象配置新资源之前,通常必须先将原先配置给左侧对象的所有资源释放掉. 如: String& String::operator=(const String& rhs) { delete [] data; ...
6 楼 ztttly123 2009-07-02 10:03
5 楼 ztttly123 2009-07-02 10:02
4 楼 ztttly123 2009-07-02 10:02
3 楼 hlylove 2009-06-29 08:19
2 楼 zozoh 2009-06-28 01:52
1 楼 inosin 2009-06-27 11:48