【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, const S_Evaluate &s);
	public:
		S_Evaluate(const char* str = "")
		{
			p = new(char[strlen(str) + 1]);
			strcpy(p, str);
		}
		~S_Evaluate()
		{
			delete[]p;
		}
	private:
		char *p;
};

ostream& operator<<(ostream& out, const S_Evaluate &s)
{
	out << s.p;
	return out;
}

int main()
{
	S_Evaluate s1("hello");
	S_Evaluate s2("apple");
	s2 = s1;
	cout << s2 << endl;
	return 0;
}



<pre name="code" class="cpp">
// 深赋值
#include <iostream>
using namespace std;

class S_Evaluate;
ostream& operator<<(ostream& out, const S_Evaluate &s);

class S_Evaluate
{
	friend ostream& operator<<(ostream& out, const S_Evaluate &s);
public:
	S_Evaluate(const char* str = "")
	{
		p = new(char[strlen(str) + 1]);
		strcpy(p, str);
	}
        //先判断是否自己给自己赋值
	S_Evaluate& operator=(const S_Evaluate &s)
	{
		if (this != &s)
		{
			delete[] p;//释放p原来可能有的空间
			p = new(char[strlen(s.p) + 1]);
			strcpy(p, s.p);
		}
		else
			return *this;
	}
	~S_Evaluate()
	{
		delete[]p;
	}
private:
	char *p;
};

ostream& operator<<(ostream& out, const S_Evaluate &s)
{
	out << s.p;
	return out;
}

int main()
{
	S_Evaluate s1("hello");
	S_Evaluate s2("apple");
	s2 = s1;
	cout << s2 << endl;
	return 0;
}


时间: 2024-09-29 15:41:06

【c++】深赋值与浅赋值的相关文章

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

Java中的深复制和浅赋值

深复制和浅复制也称为深拷贝和浅拷贝.简单的说就是创建一个和当前对象一模一样的对象.在日常编码的过程中使用的几率并不多,但在面试中却会被经常问到. 了解深复制和浅复制的原理后,可以帮助我们对Java中的值传递和引用传递有更深刻的理解. 浅复制 下面的实例中,我们创建一个原始类Monster,调用对象的clone方法复制一个新的对象. 注意:要调用对象的clone方法,需要让类实现Cloneable接口,并重写clone方法 public class Monster implements Clone

iOS 集合的深复制与浅复制

概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCopyArray = [someArray cop

深复制与浅复制

概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCopyArray = [someArray cop

python 深复制与浅复制------copy模块

模块解读: 浅复制: x = copy.copy(y)深复制: x = copy.deepcopy(y)(注:模块特有的异常,copy.Error) 深copy与浅copy的差别主要体现在当有混合对象时,即在一个对象中包含其他子对象,比如在一个字典中的一个value是一个列表,这时:浅copy,没有拷贝子对象,所以原始数据改变,子对象会跟着改变.深copy,包含拷贝对象中对子对象的拷贝,也就是说原始数据改变,子对象不会随之改变. 举个例子:info = { 'name':'webber', 'j

C++学习基础七——深复制与浅复制

一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深复制时,A中的指针str与B中的指针str指向不同的地址,只是地址所指向的数据相同. 当浅复制时,A中的指针str与B中的指针str指向相同的地址. 1.浅复制:如果我们自己不实现复制构造函数,则C++会自动合成一个复制构造函数,又称为浅复制构造函数. 2.深复制:如果使用指针或者系统资源(如数据库

(知其所以然 主题2)从底层分析OC中ARC和非ARC下深复制和浅复制

今天,在坊间听到有人在争论OC中关于NSString的深浅复制,听了下,感觉很有必要来一个分析总结,让我们从底层去了解OC中深浅复制的运作机制. 所谓copy就是在原有对象的基础上产生一个副本对象,遵循最关键的两点原则: 1. 改变原对象的属性和行为不会对副本对象产生任何影响 2. 改变副本对象的属性和行为不会对原对象产生任何影响 在理解了这一层之后,我们一起来研究下deep copy 和 shallow copy,因为苹果是一个非常注重性能的公司,所以拷贝在底层实现没那么简单: 以NSStri

js深复制和浅复制

一.关于数组的拷贝 常见问题: let arr = [1, 2, 3, 4]: let arr2 = arr arr2[2] = 10; console.log(arr[2]): // 10 console.log(arr2[2]); //10 很明显我们只想改变arr2的值,保持arr不变,但是事实是两个都会变,这是因为在js中,我们复制对象或者数组实际上只是复制了它的地址,而不是复制的真实的值,这就是我们常说的深复制和浅复制的区别: 深复制:将变量的数据赋值给对应变量 浅复制:将变量的存储地

(五)聊一聊深Copy与浅Copy

一.关于浅copy与深copy 首先说明一下: 在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号. 深copy与浅copy只是针对可变类型而言,对于不可变类型,无论深浅,值相等,内存地址一样,一旦值发生变化,相当于再创建一个对象. 浅copy有3种方法: a=[1,2,3,["a","b"],22] a1=a[:]  切片操作 a2=list(a)  工厂函数 a3=copy.copy(a)  或