C++之拷贝构造与拷贝赋值
来源:互联网 发布:淘宝关注的主播在哪里 编辑:程序博客网 时间:2024/05/29 16:45
拷贝构造和拷贝赋值------一个有点难的问题
介绍之前,我们需要首先了解深拷贝与浅拷贝的差异: 何为深拷贝,深拷贝不会复制指针,而是令目标对象拥有独立的资源,该资源是从元对象中复制,即先找到对象的指针,在通过指针拷贝其内容;
何为浅拷贝,即之赋值指针的地址,不会赋值指针的目标,容易引发double free异常,即多个目标指向同一个内存;
缺省拷贝构造函数和缺省拷贝赋值函数
如果一个类没有显示的定义一个拷贝构造函数和拷贝赋值运算符,则编译器会为其默认提供一个,但是这个函数只能进行浅拷贝;
如果一个类拥有指针的成员变量,并用指针维护动态分配的内存资源,哪么就该为该类定义支持深拷贝的拷贝构造函数和拷贝赋值运算符函数。
哪么接下来问题就来了,怎么实现呢?
拷贝构造:T::T(T const& that){} 分配资源,复制内容
拷贝赋值:T& operator=(T const& r){} 防止自赋值、分配新资源、释放旧资源、复制新内容、返回自引用;
为了防止误用,我们也可以将两者私有化,防止误用
介绍之前,我们需要首先了解深拷贝与浅拷贝的差异: 何为深拷贝,深拷贝不会复制指针,而是令目标对象拥有独立的资源,该资源是从元对象中复制,即先找到对象的指针,在通过指针拷贝其内容;
何为浅拷贝,即之赋值指针的地址,不会赋值指针的目标,容易引发double free异常,即多个目标指向同一个内存;
缺省拷贝构造函数和缺省拷贝赋值函数
如果一个类没有显示的定义一个拷贝构造函数和拷贝赋值运算符,则编译器会为其默认提供一个,但是这个函数只能进行浅拷贝;
如果一个类拥有指针的成员变量,并用指针维护动态分配的内存资源,哪么就该为该类定义支持深拷贝的拷贝构造函数和拷贝赋值运算符函数。
哪么接下来问题就来了,怎么实现呢?
拷贝构造:T::T(T const& that){} 分配资源,复制内容
拷贝赋值:T& operator=(T const& r){} 防止自赋值、分配新资源、释放旧资源、复制新内容、返回自引用;
为了防止误用,我们也可以将两者私有化,防止误用
#include<iostream> using namespace std; class Integer{ public: Integer(int num):i(new int(num)){} Integer(Integer& const that):i(new int(*that.i)){} Integer& operatot=(Integer const& r){ *i=*r.i; return *i; } ~Integer(){ delete i; } void const& getValue()const{ cout<<*i<<endl; } private: int* i; //Integer(const Integer& that); //Integer& operator(Integer const& r); }; int main(){ Integer i1(10),i2=i1; i1.getValue(); i2.getValue(); return 0; }
0 0
- C++之拷贝构造与拷贝赋值
- 拷贝构造与拷贝赋值
- 拷贝构造函数 与 拷贝赋值函数
- Cpp_拷贝构造与拷贝赋值
- 拷贝构造与赋值函数
- 拷贝构造函数与赋值函数;深拷贝,浅拷贝
- 拷贝构造函数与赋值构造函数
- 拷贝构造函数与赋值构造函数
- 拷贝构造函数与赋值构造函数
- 拷贝构造函数与赋值构造函数
- 拷贝构造函数与赋值构造函数
- 拷贝构造函数与赋值构造函数
- 构造、拷贝构造、赋值
- 拷贝构造 赋值构造
- 拷贝构造和拷贝赋值
- 【C++】拷贝构造函数和赋值函数
- python之赋值与拷贝
- 拷贝构造与拷贝赋值运算符几点摘记
- 2017,回来了~
- Shell 练习题 21—30,内附答案
- 关于如何单独失能STM32 TIM通道的方法
- 设计模式-3-建造者模式
- Bagging – building an ensemble of classifers from bootstrap samples
- C++之拷贝构造与拷贝赋值
- AJAX
- 常用操作
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- c++第五作业—三角形类
- 【LeetCode】【Python】【C++】7. Reverse Integer代码实现
- 通过反射取类的属性
- LeetCode 80. Remove Duplicates from Sorted Array II
- Java compiler level does not match the version of the installed Java project facet