11——在operator=中处理自我赋值】的更多相关文章

1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: class Widget { ... }; Widget w; ... w = w; // assignment to self. 这看上去是愚蠢的,但这是合法的,所以请放心,客户端是可以这么做的.此外,自身赋值也并不总是很容易的能够被辨别出来.举个例子: a[i] = a[j]; // potential assignment to self 上面的代码在i和j相等的情况下就是自我赋值,同样的,看下面的例子: *px =…
确保当对象自我赋值时operator=有良好行为.其中技术包括比较“来源 对象”和“目标对象”的地址.精心周到的语句顺序.以及copy-and-swap. 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确.…
记住: ★确保当对象自我赋值时operator=有良好行为.有三种方法:比较“来源对象”和“目标对象”的地址.精心周到的语句顺序.以及copy-and-swap技术 ★确定任何函数若操作一个以上对象,而其中多个对象是同一个对象时,其行为仍然正确 ------------------------------------------------------------------------------------ 潜在的自我赋值举例: a[i] = a[j];  //若i和j相同,便是自我赋值 *…
在operator=函数中加一个测试: if(&rhs==this) copy and swap…
什么是自我赋值,就是 v = v 这种类型的语句,也许很多人都会说鄙视这种写法,但是如下的写法会不会出现呢? 比如:a[i] = a[j];      // 不巧的是i可能和j相等 *px = *py;     // 也许px和py刚好指向同一个对象呢 上述例子都是隐含的自我赋值. 再举一例: class Bitmap // 位图类 { ... }; class Widget { public: Widget& operator=(const Widget& rhs); private:…
1.自我赋值,看起来愚蠢,但是却合法.有些自我赋值一眼就可看出来.有些自我赋值是潜在的.比如:a[i] = a[j]; *px = *py; 甚至不同类型的指针,都指向同一个地址,也是自我赋值,这一类自我赋值,很难识别,因此对自我赋值要有一定的防范. 2.对于资源管理类auto_ptr和shared_ptr,自我赋值是安全的.如果自行管理资源,比如Widget中有个Bitmap* pb:copy赋值如下: Widget& Widget::operator=(const Widget& rh…
1.潜在的自我赋值     a[i] = a[j];     *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象,当其中一个对象被删,另一个也被删,这会造成不想要的结果. 该怎么办? 比如:   widget& widget:: operator+ (const widget& rhs) {    delete pd;    pd = new bitmap(*rhs.pb);    return *thi…
"自我赋值"发生在对象被赋值给自己时: class Widget { ... }; Widget w; ... w = w; // 赋值给自己 a[i] = a[j]; // 潜在的自我赋值 *px = *py; // 潜在的自我赋值 class Base { ... }; class Derived: public Base { ... }; void doSomething(const Base& rb, Derived* pd); // rb和*pd有可能其实是同一对象…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为什么会出现自我赋值呢?不明显的自我赋值,是“别名”带来的结果:所谓“别名”就是“有一个以上的方法指涉对象”.一般而言如果某段代码操作pointers或references而它们被用来“指向多个相同类型的对象”,就需要考虑这些对象是否为同一个.实际上两个对象来自同一个继承体系,它们甚至不需要声明为相同类型就可能造成“别名”.因为一个base class的refe…
一.何谓“自我赋值”? 1.1.场合一 直接赋值 w = w; 1.2.场合二 同一数组         a[i] = a[j]: 1.3.场合三 指针         *px = *py: 1.4.场合四 同一继承体系         class Base{...};         class Derived: class Base{...}; 二. 自我赋值时,可能发生的问题 2.1.问题一 使用资源之前,资源已经被释放 例: class Bitmap{...}; class DeskTo…
1.确保当对象自我赋值时operator=有良好的行为,其中的技术包括 "来源对象" 和 "目标对象" 的地址,精心周到的语句顺序,以及“ copy and swap ” 技术 2.确定任何函数执行操作一个以上对象时,而其中多个对象是同一个对象时,其行为任然正确 #include <iostream> //1.0 class CopySwap1_0 { private: int *value; public: CopySwap1_0() : value(…
已经一年半没有写过博客了,最近发现学过的知识还是需要整理一下,为知笔记,要开始收费了以前写在为知笔记上笔记也会慢慢的转到博客里. 话不多说,进入正题. 考虑考虑以下场景: 当某个对象对自身赋值时,会出现什么现象?? 例子: #include <iostream> class A { private: int *arr; public: A() { arr = new int[256]; } ~A() { delete arr; } const A& operator=(const A…
假设你建立一个class 用来保存一个指针指向一块动态分配的位图. class Bitmap {......}; class Widget{ ... private: Bitmap* pb ; }; Widget& Widget::operator= (const Widget& rhs) { delete pb; pb = new Bitmap(*rhs.pb); return *this; } 上面是一份不安全的 operator= 实现版本,因为 operator= 函数内的*thi…
本来的版本是这样的: Widget & Widget::operator=(Widget rhs) { delete pb;//这里可能直接将rhs的pb删除了 pb = new (*rhs.pb); return *this; } 这里的代码完全无法处理自赋值的情况,一般是在operator的真正处理之前加上一个“证同测试”,像下面这样: Widget& Widget::operatpr=(const Widget & rhs) { if(*this == rhs) return…
当涉及到继承时,派生类的赋值运算符也必须处理它的基类成员的赋值!否则,当派生类对象向另一个派生类对象赋值时,只有派生类部分赋值了.看看下面: class base { public: ): x(initialvalue) {} private: int x; }; class derived: public base { public: derived(int initialvalue) : base(initialvalue), y(initialvalue) {} derived& oper…
防止自我赋值很有必要 Widget w; w = w; a[i] = a[j]; //a[i]和a[j]实际上指向同一个元素 *pi = *pj; //pi和pj实际上指向同一个元素 自我赋值的危害: Widget { private: Test *p; }; Widget &Widget::operator=(const Widget &w) { delete p; p = new int (*w.p); return *this; } 如果是自我赋值,会把自己的空间释放掉,即当执行de…
在赋值运算符中要特别注意可能出现别名的情况,其理由基于两点.其中之一是效率.如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回,从而可以节省大量的工作,否则必须去实现整个赋值操作. 另一个更重要的原因是保证正确性.一个赋值运算符必须首先释放掉一个对象的资源(去掉旧值),然后根据新值分配新的资源.在自己给自己赋值的情况下,释放旧的资源将是灾难性的,因为在分配新的资源时会需要旧的资源. 看看下面string对象的赋值,赋值运算符没有对给自己赋值的情况进行检查: class strin…
问题聚焦: 自我赋值看似有点愚蠢的行为,其实总会发生的 首先:它是合法的, 其次,它不一定是安全的, 再次,它有时候不是那么明显. 先看一个Demo class Widget { ... }; Widget w; ... /** 最明显的自我赋值 **/ w = w; /** 不那么明显的自我赋值 **/ // 在某个地方实现了i = j或者相同作用的事情 a[i] = a[j] /** 潜在的自我赋值 **/ *px = *py; /** 更为隐蔽的自我赋值“别名” **/ class Bas…
分类: C/C++2012-08-30 21:40 2017人阅读 评论(2) 收藏 举报 任何管理某资源的类比如智能指针需要遵循一个规则(The Rule of Three): 如果你需要显式地声明一下三者中的一个:析构函数.拷贝构造函数或者是拷贝赋值操作符,那么你需要显式的声明所有这三者. 拷贝构造函数和析构函数实现起来比较容易,但是拷贝赋值操作符要复杂许多. 它是怎么实现的?我们需要避免那些误区? 那么Copy-and-swap就是完美的解决方案.而且可以很好地帮助拷贝赋值操作符达到两个目…
vue中把props中的值赋值给data 2018年12月26日 14:37:11 木豆mudou 阅读数 3497   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_37146616/article/details/85261753 父组件: <template> <div> <navbar :ctype="ctype"></n…
最近在做的一个项目中,有13个方法都需要用到同一种处理方式:通过SQL语句从数据库获取一条指定的数据,并将该数据中的每个值都赋值给一个model,再将这个model中的数据通过微信发送出去.每个方法都会从不同的表中获取数据,需要处理的数据完全不同,因此也对应了13个不同的model.这些model中的每个属性名称是已经给定的,需要将它们post出去,使用微信给定的模板发送消息,因此每个属性的名称必须与微信提供的模板中一致. 下面举个简单的例子来说明当前的情况: SQL Server中用来存放数据…
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言中结构体赋值的问题吧: 结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //define two structs with three different field…
Microsoft.Office.Interop.Excel.Application excel =                new Microsoft.Office.Interop.Excel.Application();            excel.SheetsInNewWorkbook = 1;            excel.Workbooks.Add(); //设置Excel列名            excel.Cells[1, 1] = "学号";     …
php中引用和赋值的区别 <pphp 的引用允许用两个变量来指向同一个内容. 相当于他们可以是 不同的名字,却可以指向 同一个 物理空间. 赋值,它实际上意味着把右边表达式的值赋给左边的运算数. 相当于,他们是 不同的名字,不同的物理空间 示例: 引用 $b = '3'; echo $b; //3 $a = &$b; echo $a; //3 $b = 4; echo $b ; //4 echo $a; //4 $a = 5; echo $b ; //5 echo $a; //5 当$a 引…
create table memberinfo ( member_id int, member_name varchar(20), member_birthday varchar(50) ) go /// <summary> /// 微信消息中的参数 /// </summary> public class wechatouputpara { private String _name = ""; /// <summary> /// 会员姓名 /// &…
出处:http://bbs.ednchina.com/BLOG_ARTICLE_3013262.HTM 综合软件:Quartus II 一.有优先级的if语句 if..else if.. else if … …else..语句中是有优先级的,第一个if具有最高优先级,最后一个else优先级最低.Quartus综合出的RTL图认为,最高优先级的电路靠近电路的输出,输入到输出的延时较短:最低优先级的电路远离输出端,输入到输出的延时较长. module single_if_late(A, C, CTR…
(转载)http://s.yanghao.org/program/viewdetail.php?i=184313 php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗? class block { function block() { $this->iconWidth = "23"; $this->iconHeight = "23"; $this->bgColor = "#5B7F93"; $this->fgCol…
第11讲Android中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个线程. 当一个android应用启动,系统会启动一个进程和一个主线程来运行这个应用.Android系统会尽力保持这个进程的稳定和安全,但是,在某些特殊情况下,总会移除旧的进程来回收内存,用于新的或者更重要的进程.当要回收内存的时候,系统要决定哪些应该保留,哪些应该杀掉.因此在android进程管理中…
原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的事件处理 @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return super.onTouchEvent(event); } 基于监听的事件处理 butto…
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言中结构体赋值的问题吧: 结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //define two structs with three different field…