【C++学习记录4】类的构造函数、析构函数、赋值函数、拷贝函数

在C++中,类的构造函数、析构函数、赋值函数、拷贝函数是非常重要的概念。它们都是类中特殊的成员函数,用于完成对象的初始化、清理、拷贝等操作。以下是对这些函数的详细解释:

构造函数(Constructor)

构造函数是用于初始化类对象的特殊成员函数,它的作用是在创建对象时为对象的成员变量赋初值。在C++中,每个类都必须有一个构造函数,如果用户没有定义,则编译器会提供一个默认的构造函数。构造函数可以有多个,以参数个数或参数类型的不同来区分。

构造函数的特点如下:

  • 与类同名,没有返回类型;
  • 可以带参数,也可以不带参数;
  • 可以有多个构造函数,以参数个数或参数类型的不同来区分;
  • 在对象被创建时自动调用,用于初始化对象的数据成员;
  • 如果用户没有定义构造函数,编译器会提供一个默认的构造函数。

下面是一个示例代码来展示构造函数的特点:

#include <iostream>
using namespace std;

class MyClass {
public:
    // 默认构造函数
    MyClass() {
        cout << "调用默认构造函数" << endl;
    }
    // 带参数构造函数1
    MyClass(int num) {
        cout << "调用带一个int参数的构造函数" << endl;
    }
    // 带参数构造函数2
    MyClass(int num1, int num2) {
        cout << "调用带两个int参数的构造函数" << endl;
    }
};

int main() {
    MyClass obj1;            // 调用默认构造函数
    MyClass obj2(10);        // 调用带一个int参数的构造函数
    MyClass obj3(20, 30);    // 调用带两个int参数的构造函数

    return 0;
}

在这个示例中,我们定义了一个名为MyClass的类,其中包含了默认构造函数和两个带参数的构造函数。在main函数中,我们分别创建了三个MyClass对象,分别调用了不同的构造函数。可以看到,不同的构造函数会根据传入的参数个数和类型进行区分,每次创建对象时都会自动调用对应的构造函数。如果没有定义构造函数,编译器会提供一个默认的构造函数,它不带任何参数,用于初始化对象的数据成员。

析构函数(Destructor)

析构函数是用于清理类对象的特殊成员函数,它的作用是在对象被销毁时释放对象所占用的内存空间和资源。在C++中,每个类都必须有一个析构函数,如果用户没有定义,则编译器会提供一个默认的析构函数。析构函数不能有参数,也不能被重载。

析构函数的特点如下:

  • 与类同名,前面加上“~”符号,没有返回类型;
  • 没有参数,不能被重载;
  • 在对象被销毁时自动调用,用于释放对象所占用的内存空间和资源;
  • 如果用户没有定义析构函数,编译器会提供一个默认的析构函数。

以下是用代码演示析构函数特点的例子:

class MyClass {
public:
    MyClass() {
        std::cout << "Constructor called." << std::endl;
    }
    ~MyClass() {
        std::cout << "Destructor called." << std::endl;
    }
};

int main() {
    MyClass obj; // 创建对象,调用构造函数
    std::cout << "Object created." << std::endl;

    return 0; // 程序结束,销毁对象,调用析构函数
}

在上述代码中,我们定义了一个名为 MyClass 的类,该类具有默认构造函数和析构函数。在 main 函数中,我们创建了一个 MyClass 类型的对象 obj,这会自动调用该类的构造函数。然后我们输出一条消息表示对象已创建。当程序执行到 return 语句时,程序结束,对象 obj 会被销毁,这会自动调用该类的析构函数。在析构函数中,我们输出一条消息表示对象已销毁。

从输出结果可以看出,构造函数和析构函数分别在对象创建和销毁时被调用,它们的名字与类名相同,析构函数前面加上了一个波浪线。如果用户没有定义析构函数,编译器会提供一个默认的析构函数,这个默认的析构函数什么也不做,但是在对象销毁时也会被自动调用。

赋值函数(Assignment Operator)

赋值函数是用于对象赋值的特殊成员函数,它的作用是将一个对象的值赋给另一个对象。在C++中,赋值函数默认使用浅拷贝,即将对象的所有成员变量一一赋值。如果对象中有指针类型的成员变量,浅拷贝可能会出现问题,因为两个对象的指针成员变量可能指向同一个内存地址。

赋值函数的特点如下:

  • 与类同名,返回类型为引用类型(通常是本身的引用);
  • 有一个参数,类型是本类的常量引用;
  • 默认使用浅拷贝,可能会出现指针成员变量指向同一内存地址的问题;
  • 如果类中有指针成员变量,需要重载赋值函数,进行深拷贝操作。

下面是一个简单的例子,展示赋值函数的特点:

#include <iostream>

class MyClass {
public:
    // 默认构造函数
    MyClass() {
        std::cout << "MyClass default constructor" << std::endl;
        mData = new int(0);
    }

    // 带参数的构造函数
    MyClass(int data) {
        std::cout << "MyClass parameterized constructor" << std::endl;
        mData = new int(data);
    }

    // 拷贝构造函数
    MyClass(const MyClass& other) {
        std::cout << "MyClass copy constructor" << std::endl;
        mData = new int(*other.mData);
    }

    // 析构函数
    ~MyClass() {
        std::cout << "MyClass destructor" << std::endl;
        delete mData;
    }

    // 赋值函数
    MyClass& operator=(const MyClass& other) {
        std::cout << "MyClass assignment operator" << std::endl;
        if (this != &other) {
            *mData = *other.mData;
        }
        return *this;
    }

private:
    int* mData;
};

int main() {
    MyClass obj1(10);
    MyClass obj2 = obj1; // 调用拷贝构造函数
    MyClass obj3; 
    obj3 = obj2; // 调用赋值函数

    return 0;
}

在上面的代码中,MyClass类有一个指针类型的成员变量mData,需要在析构函数和赋值函数中注意内存的释放和拷贝问题。

在对象赋值时,如果使用默认的赋值函数,会导致两个对象的指针成员变量指向同一内存地址,这可能会出现问题。因此,我们需要重载赋值函数,进行深拷贝操作。

在上面的代码中,我们定义了一个赋值函数,使用了if语句来避免对象自我赋值的问题,并且在拷贝指针成员变量时进行了深拷贝,从而解决了指针成员变量指向同一内存地址的问题。

拷贝函数(Copy Constructor)

拷贝函数是用于对象拷贝的特殊成员函数,它的作用是创建一个新对象并将另一个对象的值复制给新对象。在C++中,如果用户没有定义拷贝函数,则编译器会提供一个默认的拷贝函数,该函数使用浅拷贝方式,即将对象的所有成员变量一一复制。与赋值函数类似,如果类中有指针成员变量,浅拷贝可能会出现问题,需要进行深拷贝操作。

拷贝函数的特点如下:

  • 与类同名,参数是本类的常量引用;
  • 默认使用浅拷贝,可能会出现指针成员变量指向同一内存地址的问题;
  • 如果类中有指针成员变量,需要重载拷贝函数,进行深拷贝操作。

在上面的示例中,MyClass 类有一个拷贝构造函数和一个赋值函数。在创建 obj2 时,拷贝构造函数被调用,进行浅拷贝。在 obj3 赋值给 obj1 时,赋值函数被调用,进行浅拷贝。

总的来说,构造函数、析构函数、赋值函数、拷贝函数是C++中非常重要的概念,它们可以帮助我们更好地管理和处理对象。熟练掌握这些函数的使用方法对于理解C++面向对象编程的核心思想和技术具有重要意义。

相关链接:
C++中构造函数,拷贝构造函数和赋值函数的区别和实现
c++中的赋值函数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值