zoukankan      html  css  js  c++  java
  • const成员-拷贝构造函数(copy constructor)-浅拷贝、深拷贝

    const成员

    • const成员:被const修饰的成员变量、非静态成员函数
    • 必须类里面初始化
    class Car {
    public:
        const int m_price = 0;    //const常量设置
        Car() :m_price(0) {}    //也可以在构造函数中初始化
        void run() const {    //const一般写最后
            cout << "run()" << endl;
    
            m_price = 10;
        }
    };
    

    const成员函数

    • 两个同名函数构成了重载
    void run() const {}
    void run() {}
    

    引用类型成员变量必须初始化

    int age;
    int & m_price = age;
    car(int &price) :m_price(price) {}
    

    拷贝构造函数(copy constructor)

    • 拷贝构造函数是构造函数的一种
    • 当利用已存在的对象创建一个新对象时(类似于拷贝),就会调用新对象的拷贝构造函数进行初始化
    • 拷贝构造函数的格式是固定的,接收一个const引用作为参数
    //拷贝构造函数
    Car(const Car &car) {
        cout << "Car(const Car &car)" << endl;
    }
    Car car4(car3);
    

    浅拷贝

    浅拷贝:指针类型的变量只会拷贝地址值

    • 编译器默认的提供的拷贝是浅拷贝(shallow copy)

    • 堆空间指向栈空间都很危险
      栈空间随机都可能回收,堆空间可以自己控制

    • 在堆空间再申请一个空间用于拷贝

    深拷贝

    public:
        Car(int price = 0, char *name = NULL) :m_price(price){
            if (name == NULL ) return;
    
            // 申请新的堆空间
            m_name = new char[strlen(name) + 1] {};
            // 拷贝字符串数据到新的堆空间
            strcpy(m_name, name);
        }
    
        ~Car(){
            if (m_name == NULL) return;
            delete[] m_name;
            m_name = NULL;
        }
    

    • 浅拷贝(shallow copy):指针类型的变量只会拷贝地址值
    • 深拷贝(deep copy):将指针指向的内容拷贝到新的存储空间
        Car(const Car &car) :m_price(car.m_price) {
            if (car.name == NULL ) return;
    
            // 申请新的堆空间
            m_name = new char[strlen(name) + 1] {};
            // 拷贝字符串数据到新的堆空间
            strcpy(m_name, name);
        }
    
  • 相关阅读:
    HashMap源码分析和应用实例的介绍
    Map不同具体实现类的比较和应用场景的分析
    Set集合架构和常用实现类的源码分析以及实例应用
    深入理解JVM(7)——类加载器
    深入理解JVM(5)——HotSpot垃圾收集器详解
    PoolManager 简单使用
    HDU4786_Fibonacci Tree
    UVA11653_Buses
    UVA11625_Lines of Containers
    HDU3507_Print Article
  • 原文地址:https://www.cnblogs.com/sec875/p/12328947.html
Copyright © 2011-2022 走看看