运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)
一般的我们喜欢这样对对象赋值:
Person p1;Person p2=p1;
classT object(another_object), or A a(b);
classT object = another object;
class A
{
// …
};
int main( )
{
A x;
A y(x);
// …
A z = x;
z = y;
}
这样的话,如果成员变量中有指针的话,就容易造成指针的二次删除。这样就需要我们显示的在类中实现
1、拷贝构造,
2、赋值运算符重载。
1)、判断是不是自赋值,2)、释放旧空间,3)、开辟新空间。4)、内容本身的 拷贝,5)、返回*this
3、析构函数(释放指针指向的空间)。
这三步使类实现深拷贝,从而避免浅拷贝的二次删除问题。俗称三大件。
class Vector
{
private:
int *rep;
int size;
void clone(const Vector& a);
void dispose( );
public:
Vector(int s=0);
// a default constructor initializing all members of rep to 0 if s is not 0.
Vector( int*, int );
// a constructor creates a Vector object from an ordinary array
Vector(const Vector& v); // a copy constructor
~Vector( ) {dispose( );} // a destructor
int get_size( ) const {return size;} // an accessor
const Vector& operator=(const Vector& x);
int& operator[ ](int index) {return rep[index];}
const int& operator[ ](int index) const {return rep[index];}
};
//Vector v;
//V = a;
//Vector v(a);
void Vector::clone(const Vector& a)
{
this->size = a.size; rep = new int[size];
for (int count = 0; count < size; ++count)
rep[count] = a[count]; // (*this)[count] = a[count];
// rep[count] = a.rep[count];
}
void Vector::dispose( )
{
delete [ ] rep;
rep = NULL;
}
Vector::Vector(int s) : size(s)
{
if (size <= 0)
{ rep = NULL; }
else
{
rep = new int[size];
for (int count = 0; count < size; ++count)
{ rep[count] = 0; } }
}
Vector::Vector(int* a, int s) : size(s), rep(new int[s])
{
for (int count = 0; count < size; ++count)
{ rep[count] = a[count]; }
}
Vector::Vector(const Vector& v)
{ clone(v); }
//for example: Vector a, v; a.=(v);
const Vector& Vector::operator=(const Vector& x)
{
if ( this != &x ) //Vector v; Vector* p = &v; v = *p;
{
delete []rep;
this->size = x.size;
rep = new int[size];
for (int count = 0; count < size; ++count)
rep[count] = x[count];
}
return *this;
}
// overloading operator <<, not a friend function
ostream& operator<<(ostream& out, const Vector& x)
{
int s = x.get_size( );
for (int i = 0; i < s; ++i)
{
out << x[i]<<endl; // out<<x.rep[i]<<endl;
}
out << endl;
return out;
}
bool operator==(const Vector& a, const Vector& b)
{
bool yes = true;
if (a.get_size( ) != b.get_size( ))
{ yes = false; }
else
{
int s, index = 0;
s = a.get_size( );
while (index < s && a[index] == b[index])
{ ++index; }
if (index < s)
{ yes = false; }
}
return yes;
}
int main()
{
Vecter vec1;
cout<<vec1<<endl;
int array[5] = {1,2,3,4,5};
Vector vec2( array, 5 );
cout<<vec2<<endl;
Vector vec3( vec2 );
cout<<vec3<<end;
if( vec3 == vec2 )
{
Cout<<”The vector3 is equal to vector2”<<endl;
}
Vector vec4;
vec4 = vec3;
cout<<vec4<<end;
return 0;
}
运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)的更多相关文章
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- [置顶] 运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)
一般的我们喜欢这样对对象赋值: Person p1;Person p2=p1; classT object(another_object), or A a(b); classT object = ...
- 浅拷贝(Shallow Copy) VS 深拷贝(Deep Copy)
首先,深拷贝和浅拷贝针对的是对象类型(对象,数组,函数) 浅拷贝指的是只是拷贝了对象的引用地址,彼此之间高耦合,一个改变,另一个可能也随之改变: 深拷贝是指只是完整的将变量的值拷贝过来,是一个新的对象 ...
- 由Python的浅拷贝(shallow copy)和深拷贝(deep copy)引发的思考
首先查看拷贝模块(copy)发现: >>> help(copy)Help on module copy:NAME copy - Generic (shallow and dee ...
- python(41):copy拷贝(深拷贝deepcopy与浅拷贝copy)
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1.copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2.copy.deepco ...
- Python浅拷贝copy()与深拷贝deepcopy()区别
其实呢,浅拷贝copy()与深拷贝deepcopy()之间的区分必须要涉及到python对于数据的存储方式. 首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的 ...
- copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)
写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...
- PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天
PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数 1 构造 2 析构 3 赋值 4 拷贝构造 5 oper ...
- C++学习6-面向对象编程基础(运算符重载、类的派生与继承、命名空间)
运算符重载 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.重载的运算符是遵循函数重载的选择原则,根据不同类型或不同参数来选择不同的重载运算符. 运 ...
随机推荐
- 【BZOJ】4311: 向量(线段树分治板子题)
题解 我们可以根据点积的定义,垂直于原点到给定点构成的直线作一条直线,从正无穷往下平移,第一个碰到的点就是答案 像什么,上凸壳哇 可是--动态维护上凸壳? 我们可以离线,计算每个点能造成贡献的一个询问 ...
- LoadRunner中Vugen-Recording Options选项卡介绍:
LoadRunner中Vugen-Recording Options选项卡介绍:
- Windows搭建python开发环境[一]
首先需要去python的官网下载环境.鼠标移动到Downloads的tab上,在这里可以下载. python的环境还是很人性化的,没有那么多罗里吧嗦的配置什么的,下载好以后直接无脑next就行了,直到 ...
- Redis实战配置(三)
程序配置 我们安装好了Redis的系统服务,此时Redis服务已经运行. 现在我们需要让我们的程序能正确读取到Redis服务地址等一系列的配置信息,首先,需要在Web.config文件中添加如下信息: ...
- Java反序列化漏洞之殇
ref:https://xz.aliyun.com/t/2043 小结: 3.2.2版本之前的Apache-CommonsCollections存在该漏洞(不只该包)1.漏洞触发场景 在java编写的 ...
- 趴一趴京东的Ajax动态价格页面
AJAX,异步加载技术!!! 之前在网上看过很多朋友有一种疑问,为什么在看京东网页的源代码里面看不到价格或则折扣一类的数据,而在网页上正常显示却能看到?...之前我也没有想到是AJAX,因为我写写爬虫 ...
- FastReport.Net使用:[16]图片控件使用
FastReport中,图片(Picture)控件的用法? 支持的图片格式 1.BMP, PNG, JPG, GIF, TIFF, ICO, EMF, WMF 支持的数据源 支持图片,数据列,文件名, ...
- 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 830 Solved: 338 Description ...
- Java并发(九):重入锁 ReentrantLock
先做总结: 1.为什么要用ReentrantLock? (1)ReentrantLock与synchronized具有相同的功能和内存语义: (2)synchronized是重量级锁,性能不好.Ree ...
- MySql - GROUP BY 和 HAVING关键字
本文主要针对GROUP BY 和 HAVING两个关键字进行分析 使用测试表如下: 测试前,只知道GROUP BY 这个关键字的作用是根据一个字段进行分组,去重.HAVING对分组设置条件. 具体分组 ...