zoukankan      html  css  js  c++  java
  • 2.拷贝控制操作(三/五法则)

    当定义一个类时,我们显式地或隐式地指定了此类型的对象在拷贝、赋值和销毁时做什么。一个类通过定义三种特殊的成员函数来控制这些操作,分别是拷贝构造函数赋值运算符析构函数

    拷贝构造函数定义了当用同类型的另一个对象初始化新对象时做什么,赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么,析构函数定义了此类型的对象销毁时做什么。我们将这些操作称为拷贝控制操作

    由于拷贝控制操作是由三个特殊的成员函数来完成的,所以我们称此为“C++三法则”。在较新的 C++11 标准中,为了支持移动语义,又增加了移动构造函数和移动赋值运算符,这样共有五个特殊的成员函数,所以又称为“C++五法则”。也就是说,“三法则”是针对较旧的 C++89 标准说的,“五法则”是针对较新的 C++11 标准说的。为了统一称呼,后来人们干把它叫做“C++ 三/五法则”。

    例:

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    //变长数组类
    class Array{
    public:
        Array(int len);
        Array(const Array &arr);                                              //拷贝构造函数
        ~Array();                                                             // 析构函数
    public:
        int operator[](int i) const { return m_p[i]; }  //获取元素(读取)
        int &operator[](int i){ return m_p[i]; }  //获取元素(写入)
        Array & operator=(const Array &arr);                                  //重载赋值运算符
        int length() const { return m_len; }
    private:
        int m_len;
        int *m_p;
    };
    
    Array::Array(int len): m_len(len){
        m_p = (int*)calloc( len, sizeof(int) );
    }
    
    Array::Array(const Array &arr){  //拷贝构造函数
        this->m_len = arr.m_len;
        this->m_p = (int*)calloc( this->m_len, sizeof(int) );
        memcpy( this->m_p, arr.m_p, m_len * sizeof(int) );
    }
    
    Array::~Array(){ free(m_p); }
    
    Array &Array::operator=(const Array &arr){  //重载赋值运算符
        if( this != &arr){  //判断是否是给自己赋值
            this->m_len = arr.m_len;
            free(this->m_p);  //释放原来的内存
            this->m_p = (int*)calloc( this->m_len, sizeof(int) );
            memcpy( this->m_p, arr.m_p, m_len * sizeof(int) );
        }
        return *this;
    }
    
    //打印数组元素
    void printArray(const Array &arr){
        int len = arr.length();
        for(int i=0; i<len; i++){
            if(i == len-1){
                cout<<arr[i]<<endl;
            }else{
                cout<<arr[i]<<", ";
            }
        }
    }
    
    int main(){
        Array arr1(10);
        for(int i=0; i<10; i++){
            arr1[i] = i;
        }
        printArray(arr1);
       
        Array arr2(5);
        for(int i=0; i<5; i++){
            arr2[i] = i;
        }
        printArray(arr2);
        arr2 = arr1;  //调用operator=()
        printArray(arr2);
        arr2[3] = 234;  //修改arr1的数据不会影响arr2
        arr2[7] = 920;
        printArray(arr1);
       
        return 0;
    }

    运行结果:

    0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    0, 1, 2, 3, 4
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9

  • 相关阅读:
    jquery拖拽插件 tableDnD
    爱回收jd图标
    struts2框架学习笔记2:配置详解
    struts2框架学习笔记1:搭建测试
    hibernate框架学习笔记12:查询优化
    hibernate框架学习笔记11:Criteria查询详解
    hibernate框架学习笔记10:HQL查询详解
    hibernate框架学习笔记9:多对多关系案例
    hibernate框架学习笔记8:一对多关系案例
    hibernate框架学习笔记7:HQL查询、Criteria查询简介
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/7121151.html
Copyright © 2011-2022 走看看