40.C++ 构造函数与析构函数

目录

1.构造函数

构造函数在以下情况被调用:

构造函数可以具有以下特点:  

下面是一个简单的示例代码,展示了一个类的构造函数的定义和用法:  

构造函数的特征

2.析构函数

析构函数的声明和定义如下:

以下是一个使用析构函数的示例,用于释放动态分配的内存:


放暑假了,欠了很多的帐。今天继续补!!!今天进行了构造函数和析构函数的复习。

1.构造函数

       在C++中,构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。构造函数的名称与类名相同,没有返回类型(包括void),并可以带有参数。

构造函数在以下情况被调用:

  1. 对象被创建时:当使用new运算符创建对象时,构造函数被自动调用。

  2. 对象在栈上被声明时:当在函数内部或作为函数参数时,对象在栈上被声明并分配内存时,构造函数被自动调用。

  3. 对象作为另一个对象的成员时:当对象作为另一个对象的成员时,构造函数被调用以初始化该成员对象。

构造函数可以具有以下特点:  

  1. 可以重载:一个类可以有多个构造函数,它们可以具有不同的参数列表,以允许不同的对象初始化方式。

  2. 可以有默认参数:构造函数的参数可以有默认值,这样在创建对象时可以省略相应的参数。

  3. 可以使用成员初始化列表:构造函数可以使用成员初始化列表来初始化对象的数据成员,以提供更高效的初始化方式。

下面是一个简单的示例代码,展示了一个类的构造函数的定义和用法:  

class MyClass {
private:
    int value;
public:
    MyClass() {
        value = 0; // 默认构造函数,将value初始化为0
    }
    MyClass(int initValue) {
        value = initValue; // 带参数的构造函数,使用传入的值初始化value
    }
    int getValue() {
        return value;
    }
};

int main() {
    MyClass obj1; // 调用默认构造函数
    MyClass obj2(10); // 调用带参数的构造函数
    cout << obj1.getValue() << endl; // 输出: 0
    cout << obj2.getValue() << endl; // 输出: 10
    return 0;
}

在上述示例中,MyClass类定义了两个构造函数:一个是默认构造函数,用于将value初始化为0;另一个是带参数的构造函数,用于接受一个参数并将其用于初始化value

main()函数中,通过创建MyClass的对象并调用其成员函数getValue(),可以获取对象的值并输出到控制台。

构造函数在类的实例化过程中非常重要,它使得对象的创建和初始化成为可能,确保对象在使用之前处于有效的状态。

构造函数的特征

构造函数时特殊的公有成员函数(在特殊用途中构造函数的访问限定可以定义成私有或者保护)

1.函数名与类名相同。

2.构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可写void。实际上 构造函数有返回值,返回的就是构造函数所创建的对象。

3.在程序运行时,当新的对象被建立,该对象所属的类构造函数自动被调用,在该对象生存期中也 只调用这一次。

4.构造函数可以重载。严格地讲,类中可以定义多个构造函数,它们由不同的参数表区分,系统在 自动调用时按一般函数重载的规则选一个执行。

5.构造函数可以在类中定义,也可以在类中声明,在类外定义。

6.如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数:

       但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。只要构造函数是无参的或 者只要各参数均有缺省值的,C++编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个。

在上述类的设计中,先设计的是real,然后是image。在构造函数时,虽然先给出的是image,但是在public里先构造的是real,因此在构造函数中应先执行real。  

2.析构函数

在C++中,析构函数(Destructor)是一种特殊的成员函数,用于在对象生命周期结束时执行清理和资源释放操作。析构函数的主要目的是回收对象所占用的资源,例如释放动态分配的内存、关闭文件等。

析构函数的声明和定义如下:

class MyClass {
public:
    // 析构函数
    ~MyClass() {
        // 在这里进行资源释放和清理操作
    }
    
    // 其他成员函数和成员变量的声明
};

析构函数的名称与类名相同,前面带有波浪线(~。它没有参数,也没有返回类型。在析构函数内部,你可以编写所需的清理代码,如释放内存、关闭文件等。析构函数在对象生命周期结束时自动被调用,你不需要手动调用它。

以下是一个使用析构函数的示例,用于释放动态分配的内存:

#include <iostream>

class MyClass {
public:
    int* data;

    // 构造函数
    MyClass(int size) {
        data = new int[size];
        std::cout << "构造函数被调用!" << std::endl;
    }

    // 析构函数
    ~MyClass() {
        delete[] data;
        std::cout << "析构函数被调用!" << std::endl;
    }
};

int main() {
    MyClass obj(5); // 创建对象

    // 执行其他操作...

    return 0;
}

在这个示例中,构造函数用于动态分配一个大小为5的整型数组,并将其地址存储在data成员变量中。析构函数用于在对象生命周期结束时释放这块内存。当对象obj超出作用域或程序结束时,析构函数会自动被调用,释放内存。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清酒。233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值