【c++】异常安全深赋值

// 深拷贝,异常安全的深赋值

#include <iostream>
#include <string.h>
using namespace std;

class String
{
public:
	String(const char *str = " ")
	{
		m_data = new char[strlen(str) + 1];
		strcpy(m_data, str);
	}
	String(const String &s)
	{
		m_data = new char[strlen(s.m_data) + 1];
		strcpy(m_data, s.m_data);
	}
	// 异常安全的深赋值
	// 一般深赋值要先释放原来m_data的空间,若原来空间里的东西还有用,就会带来很大的麻烦
	// 这种深赋值可以避免出现那样的情况
	String& operator=(const String &s)
	{
		if (&s != this)
		{
			String tmp(s.m_data);// 用要赋值的数据重新构造出一个对象
			char *ptmp = m_data;// 交换指针的指向
			m_data = tmp.m_data;
			tmp.m_data = ptmp;
		}
		return *this;
	}
	~String()
	{
		delete[]m_data;
	}
public:
	void print()
	{
		cout << m_data << endl;
	}
private:
	char *m_data;
};

int main()
{
	String s("hello");
	s.print();
	String s1(s);
	s1.print();
	String s2;
	s2 = s1;
	s2.print();
	return 0;
}

时间: 2024-11-06 23:28:58

【c++】异常安全深赋值的相关文章

【c++】深赋值与浅赋值

// 深赋值与浅赋值 // 浅赋值,这样的浅赋值会导致程序崩溃,与浅拷贝一个理 #include <iostream> using namespace std; class S_Evaluate; ostream& operator<<(ostream& out, const S_Evaluate &s); class S_Evaluate { friend ostream& operator<<(ostream& out, co

赋值、复制构造函数和构造函数 &amp; 异常安全的赋值

异常安全的赋值 需要注意,复制赋值和复制构造,相兼容. 赋值时候,要带上自检查.

C++中的默认函数 深拷贝与浅拷贝 深赋值与浅赋值

1.C++中什么都不写,就有6个默认函数,由系统自动提供: 构造函数,拷贝构造函数,赋值语句,析构函数,对一般对象的取地址符,对常对象的取地址重载: 对&运算符的重载: Test t3; Test *pt = &t3; Test* operator&(){     return this; } 对常对象的取地址重载: const Test t4; const Test *pt1 = &t4; const Test* operator&()const{     ret

iOS 浅赋值、深复制、完全复制的知识点梳理验证(附加归档解档)

写于前: 在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值,本文将对这几个概念进行验证梳理. (单层和完全概念区分:例如多层数组只实现一层内容拷贝,其他层为指针拷贝成为单层深复制:若多层内容都实现拷贝称为完全赋值) 程序中用到的几点概念补充 (1) 浅复制(shallow copy):在浅复制操作时,对于被复制对象的每一层都是指针复制. 深复制(

记录到日志中的异常栈缺失

项目中有这样一个场景: 使用反射处理所有业务调用,在反射调用点使用try-catch集中处理异常,并将异常信息记录到日志.其中日志记录是异步的. 问题: 记录到日志中的异常的StackTrace和有时候和Debug时抛出的异常的StackTrace不一样. 原因: 由于记录日志是异步的,如果记录日志发生在throw之前,记录到日志中的异常的StackTrace就是正确的(异常真正发生点到throw点的所有StackTrace):如果记录日志发生在throw之后,记录到日志中的异常的StackTr

python0.10-----变量作用域和异常

变量的作用域:也可以称为命名空间,即变量可以使用的范围.程序的变量并不是在所有的位置都能使用的,访问的权限决定于变量在哪里赋值(定义)的.只有当变量在模块,类,函数中定义的时候,才会有作用域的概念.if分支结构,for-else,while,for遍历循环结构,try-except(-else)\try-except-finally等关键字语句块不会产生作用域. 局部变量与局部作用域: #定义函数 def discount(price,rate) final_price=price*rate r

移动构造和移动赋值与std::move

---------------------------------------移动构造-------------------------------------------- 传统的深拷贝深赋值 对于类中,含有指针的情况,要自实现其拷贝构造和拷贝赋值.也就是所谓的深拷贝和深赋值.我想这己经成为一种共识了. 比如如下类: #include <iostream> using namespace std; class HasPtrMem { public: HasPtrMem():_d(new in

Objective-C 浅析

1.简介 从今天开始接触IOS开发,而后则接触PHP开发,接触是为了更好的理解开发.IOS的开发前提是Objective-C,本篇简单总结其知识点.什么是Objective-C,它是C的面向对象的扩展. 2.知识点 1.Objective-C类定义有两个部分:接口部分和实现部分. 接口部分:@interface className:superclassName{ Instance variable declarations}Method declarations@end 实现部分:类的方法的实现

Java重要技术(15)内省之属性改变事件和投票否决事件

1.1. 属性改变事件和投票否决事件 PropertyChangeSupport类为Java Bean支持属性改变事件提供了方便. /** * @Title: EventBean.java * @Package com.test.javatechnology.introspection * @Description: * @author http://www.cnblogs.com/coe2coe/ * @date 2017年3月25日 下午6:02:36 * @version V1.0 */