C++之拷贝构造与拷贝赋值

  拷贝构造和拷贝赋值------一个有点难的问题

  介绍之前,我们需要首先了解深拷贝与浅拷贝的差异:  何为深拷贝,深拷贝不会复制指针,而是令目标对象拥有独立的资源,该资源是从元对象中复制,即先找到对象的指针,在通过指针拷贝其内容;

  何为浅拷贝,即之赋值指针的地址,不会赋值指针的目标,容易引发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;

  }

时间: 2024-12-21 23:34:04

C++之拷贝构造与拷贝赋值的相关文章

C++ 拷贝构造函数和重载赋值操作符相互调用分析 [转]

结论: 从面相对象编程的角度考虑,拷贝构造函数调用重载赋值操作符,重载赋值操作符调用拷贝构造函数的写法都是没有意义的.应该避免. Don't try to implement one of the copying functions in terms of the other. Instead, put common functionality in a third function that both call. ——Effective C++ Third Edition By Scott M

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

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

赋值函数与拷贝构造的差异

C++ 拷贝构造函数 赋值构造函数 ================================= 一句话,赋值函数的前提是对象已定义:而拷贝构造是执行时才会创建一个对象.拷贝构造需要的是深拷贝. 赋值函数一般模式: type& operator =(const type& par) { // (1) 检查自赋值 if( this == &par ) return *this; // (2) 释放原有的内存资源 //(3)分配新的内存资源,并复制内容 ,2.3顺序没讲究,注意释

C++基本函数的调用优化(构造、拷贝构造、赋值)

合理的函数可提升时间和空间的利用率 //Test1.h #include<iostream> using namespace std; struct ST { private: int a; short b; public: ST(int a=0, short b=0):a(a),b(b) { this->a = a; this->b = b; cout<<"Object was Built. "<<this<<endl; }

为什么类的拷贝构造参数加引用、重载赋值函数的返回值和参数加引用

class string { public: string(const char *str=NULL); string(const string& str);     //copy构造函数的参数为什么是引用呢? string& operator=(const string & str); //赋值函数为什么返回值是引用呢?参数为什么是引用呢? ~string(); }; 下面我就给大家解释一下: class String1 { public: String1(const char*

构造、拷贝构造、赋值、析构

需要注意的问题(当数据成员函数指针型变量,需要申请空间赋值时) 1.构造函数 ①需要给空指针申请一个‘\0’的空间 2.拷贝构造函数 ①传入的参数,必须引用传递否则会出现无休止的拷贝构造 ②对其参数值不做修改,传入的参数需要加const ③避免浅拷贝的产生,每次拷贝构造,都重新申请空间赋值. 3.赋值= ①需要返回引用型变量,否则会再返回值时,创建临时对象,又会无休止的拷贝构造 ②对其参数值不做修改,传入的参数需要加const ③最重要先判断是否是给自己赋值,如果是,直接返回 ④为考虑到异常安全

类的成员函数(构造、析构、拷贝构造、赋值、运算符重载)的实现

以String类为例实现其成员函数 class String { //友元函数重载运算符 friend ostream& operator<<(ostream &out,String& str); friend istream& operator>>(istream& in, String& str); public: //通用构造函数 String(const char* str) { if(!str) //对m_data加NULL

C++笔记(11):拷贝控制(拷贝移动,构造赋值,析构)

控制对象拷贝,赋值,析构 拷贝构造函数,移动构造函数 拷贝赋值运算符,移动赋值运算符 析构函数 ------------------------------------------------------------------------------------------------------------------------------------- 1. 拷贝构造函数:参数必须是引用类型&,一般是const的 拷贝构造函数的第1个参数指的是对于自身类类型的引用 2.拷贝赋值运算符:本

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直