class B
{
};
class A
{
public:
A& operator=(const A& a)
{
B* temp = b; //这里解决重复赋值的方法是用temp指向自己,如果一样,下面的 delete会删掉
b = new B(*a.b);//关键复制,就是把b=new B;b=a.b;分开写
delete temp; //删掉过去的自己,delete 尽量后面写,万一delete后有抛出异常这些什么就很尴尬
   return *this; //上面那句delete一定是new的
}
B* b; }; int main()
{
int a = 3;
int *b = &a;
int *c = new int(*b);//新的new 方法,两条语句合在一起写
int *d = new int;//和上面的同一个意思
d = b;
int *e = new int(a);//和上面的一个意思
     int *f = new int(3);//和上面的一个意思
cout << *b << endl << *c << endl << *d << endl << *e;
}

  

  还有一种copy and swap的方法

private:
int a;
void swapp(A& x)//在自己特有的swap上调用标准的swap
{
swap(x.a, a);
//swap(其他数据)
}
public:
A(int x) :a(x){}
A& operator=( A x)
{
swapp(x);
return *this;
}

  这个是我用过的旧版本

class A
{
int a;
public:
A(int x) :a(x){}
template<typename T >//使用自己特例化的swap
void swap(T& a)
{
int itemp = this->a;
this->a = a.a;
a.a = itemp;
}
A& operator=(A x)//和下面的一样,少了传值复制这个步骤,代码更加整洁,建议用这个
{
swap(x);//原来有的数据会被当作临时数据而delete掉
return *this;
}
A& operator=(const A& x)
{
A temp = x;
swap( temp);
return *this;
}
void display()
{
cout << a << endl;
}
};
int main()
{
A a(3), b(1);
A c(a);
b = a;//测试赋值
a = a;//测试自我赋值
a.display();
b.display();
c.display();
}

  以前没有特例化swap函数而导致无限重复调用的失败例子

swap(temp, *this);
我貌似知道为什么不行了
swap里面有temp=*this之类的语句
就会调用operator=的函数然后无限重复
所以要用自己特例化的swap

void swapp(T a, T b)        //和下面重复调用
{
T temp = a;
a = b;
b = temp;
} class A
{
int a;
public:
A(int x) :a(x){}
A& operator=( A x) //和上面重复调用
{
swapp(*this,x);
return *this;
}

  

  

												

安全性良好的operator=操作,和新的new方法(针对深度复制的情况)的更多相关文章

  1. CREATE OPERATOR - 定义一个新的操作符

    SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...

  2. python操作日期和时间的方法

    不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...

  3. JS子父窗口互相操作取值赋值的方法介绍

    $("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...

  4. 多人操作sqlite3数据库冲突问题解决方法

    问题描述:sqlite3数据放置在某一台电脑的某个共享文件夹下,操作数据库的应用程序安装在同一局域网下的很多台电脑上,由于存在多人同时使用该应用程序,所以存在多人同时操作数据库的情况.经过测试发现,最 ...

  5. .net(C#)操作文件的几种方法汇总

    .net(C#)操作文件的几种方法汇总 System.IO命名空间下类的用法:在System.IO名称空间中包含了用于文件输入输出的主要类.File:实用类,提供许多静态方法,用于移动.复制和删除文件 ...

  6. Selenium 新窗口处理方法

    有时点击一个链接,跳到一个新的窗口,这时WebDriver需切换到新窗口,才能对新窗口的元素进行操作 这里封装一个switchToWindow方法: public boolean switchToWi ...

  7. java8在Collection中新增加的方法removeIf

    记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题.问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么做?我当时也没想,就直接说,List的有自带的remove方 ...

  8. Eviews 9.0新功能——估计方法(ARDL、面板自回归、门限回归)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 9.2 估计功能 eviews9.0下载链接: ...

  9. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

随机推荐

  1. mysql导入excel数据

    1.第一步我们得到了一个excel表,里面有很多需要我们导入的数据. 2.删除第1行"准考证号""XXX"....只保留我们需要的数据部分. 3.单击" ...

  2. Python自动化运维之4、格式化输出、文件对象

    Python格式化输出: Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[P ...

  3. C++构造函数 & 拷贝构造函数 & 派生类的构造函数 & 虚继承的构造函数

    构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数 ...

  4. HttpClient3.1 警告: Cookie rejected:

    四月 , :: 下午 org.apache.commons.httpclient.HttpMethodBase processCookieHeaders 警告: Cookie rejected: : ...

  5. Activity之间切换使用系统内置动画

    例如: startActivity(intent); overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out) ...

  6. C51系列RAM寄存器表

    特殊功能寄存器地址表 SFR 符号 字节 地址 位地址和位名称 D7 D6 D5 D4 D3 D2 D1 D0 P0口 P0 80H P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0. ...

  7. 用TMS的控件就可以了,有bug叫他们改

    [深圳]大宝delphi本身不是太隐定.不建议弄太多自己的东西.还要debug好长时间.为了快.便不去弄控件了够用了.真的.都不用花太多时间去弄这弄那.有bug叫他们改便可以.

  8. 一本QT书,连接MySQL图文并茂

    http://qtdebug.com/index.html http://qtdebug.com/DB-AccessMySQL.html

  9. Eclipse设置合适的字体

    一直使用Eclipse开发,最近感觉Comic Sans MS不错,但我的eclipse的默认字体里没有. 如果系统里有这个字体的话,那可以很简单的将这个字体添加到Eclipse中: Windows ...

  10. 算法:求 Huffuman树 构造费用

    问题背景:            Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程.            给出一列数{pi}={p0, p1, …, pn-1}, ...