C++ 拷贝构造函数定义方法

拷贝构造函数

一般情况下,C++中将一个类的实例对象直接“赋值”给同类的实例对象,该过程则是通过复制来完成的。那么,C++中类的定义在什么时候需要定义一个拷贝构造函数呢?通常情况下,一个类没有定义拷贝构造函数,那么C++的编译器会自动为其定义一个,可当类中带有指针成员,并有动态内存分配的情况下,则需要自定义一个拷贝构造函数。

C++拷贝构造函数一般语法

C++的拷贝构造函数与类的名称一致,一般为public公有成员,参数一般为const常量,具体的语法可参考如下(不一定是非要如此,只是比较常用的语法):

className (const className &obj) {
   code_block;
}

重点提示:因为需要自定义拷贝构造函数的一个条件是类class中的成员需要动态分配内存,而在C++中,动态分配内存通常又需要手动来删除该分配的内存空间释放内存资源,因此定义了拷贝构造函数一般就需要同样定义一个析构函数,用于手动删除动态分配的内存空间。

语法解析

参数obj是一个className实例对象的引用,作用是用于实例化(初始化)另一个className的对象。

拷贝构造函数实例代码

#include <iostream>
using namespace std;


class Fruit{
    public:
        string getName();
        Fruit(string); //构造函数
        Fruit(const Fruit &obj);//拷贝构造函数
        ~Fruit(); //析构函数
    
    private:
        string *fruit_name;
};

//构造函数定义
Fruit::Fruit(string n){
    fruit_name = new string; // 动态分配内存
    *fruit_name = n;
}

//拷贝构造函数定义
Fruit::Fruit(const Fruit &obj){
    fruit_name = new string;
    *fruit_name = *obj.fruit_name;
}

//析构函数动态删除分配的内存
Fruit::~Fruit(){
    delete fruit_name;
}

// getName()方法定义
string Fruit::getName(){
    return *fruit_name;
}

int main() {

    Fruit a1("苹果");
    Fruit a2 = a1;
    cout << a2.getName() << endl;

    return 0;
    
}

免责声明:内容仅供参考,不保证正确性。


全栈后端 / C++教程 :
















Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.