自学内容网 自学内容网

构造函数和析构函数

构造函数是一种特殊的成员函数,用于在创建对象时初始化对象。它具有与类名相同的名称,并且不返回任何值,也没有返回类型。构造函数可以重载,以允许不同类型的初始化。

构造函数的特性:

  • 自动调用:当创建对象时,构造函数会自动被调用
  • 初始化成员变量:构造函数用于初始化对象的成员变量
  • 没有返回值:构造函数不返回任何值,也不返回void
  • 可以重载:可以有多个构造函数,只要它们的参数列表不同
#include <iostream>

class Person {
public:
    // 默认构造函数
    Person() {
        std::cout << "默认构造函数" << std::endl;
    }
};


int main() {
    Person jack;  // 创建Person对象,会自动调用默认构造函数
    Person jane;  // 创建Person对象,会自动调用默认构造函数
    
    return 0;
}
---------
默认构造函数
默认构造函数 
#include <iostream>

class Person {
public:
    std::string p_name;
    int p_age;

    // 默认构造函数,并对成员变量进行初始化
    Person() : p_name("Jack"), p_age(18) {
        std::cout << "姓名:" << p_name << std::endl;
        std::cout << "年龄:" << p_age << std::endl;
    }
};


int main() {
    Person jack;  // 创建Person对象,会自动调用默认构造函数

    return 0;
}
---------
姓名:Jack
年龄:18
#include <iostream>

class Person {
public:
    std::string p_name;
    int p_age;

    // 重载构造函数,并将传入的参数赋给成员变量
    Person(const std::string& name, const int& age) : p_name(name), p_age(age) {
        std::cout << "成员变量:" << p_name  << " " << p_age << std::endl;
        std::cout << "参数:" << name  << " " << age << std::endl;
    }
};


int main() {
    std::string str = "lussy";
    int num = 20;

    Person jack(str, num);  // 创建Person对象,并调用重载构造函数

    return 0;
}
---------
成员变量:lussy 20
参数:lussy 20
#include <iostream>

class Person {
public:
    std::string p_name;
    int p_age;

    // 重载构造函数,并将传入的参数赋给成员变量
    Person(const std::string& name, const int& age) {
        p_name = name;
        p_age = age;
        std::cout << "成员变量:" << p_name << " " << p_age << std::endl;
        std::cout << "参数:" << name << " " << age << std::endl;
    }
};


int main() {
    std::string str = "lussy";
    int num = 20;

    Person jack(str, num);  // 创建Person对象,并调用重载构造函数

    return 0;
}
---------
成员变量:lussy 20
参数:lussy 20

析构函数是一种特殊的成员函数,用于在对象的生命周期结束时进行清理工作。它具有与类名相同的名称,但前面有一个波浪号(~),并且不返回任何值,也没有参数。

析构函数的特性:

  • 自动调用:当对象的生命周期结束时,析构函数会自动被调用
  • 清理资源:析构函数用于释放对象所占用的资源,如动态分配的内存、文件句柄、网络连接等
  • 没有返回值:析构函数不返回任何值,也不返回void
  • 不能重载:每个类只能有一个析构函数
#include <iostream>

class Resource {
public:
    // 构造函数
    Resource() {
        std::cout << "Resource acquired." << std::endl;
    }

    // 析构函数
    ~Resource() {
        std::cout << "Resource released." << std::endl;
    }
};


int main() {
    Resource res;

    return 0;
}
---------
Resource acquired.
Resource released.

对象的生命周期示例:

int main() {
    {
        Resource res;  // 调用Resource的构造函数
        // ...
    }  // res的生命周期结束,调用析构函数

    Person p("Alice", 30);  // 调用Person的构造函数
    // ...
    return 0;  // p的生命周期结束,调用析构函数
}

在这个示例中,当Resource的对象res被创建时,构造函数被调用,当res离开作用域时,析构函数被调用以释放资源。同样,当Person的对象p被创建时,构造函数被调用,程序结束时,析构函数被调用。

注意:

  • 构造函数和析构函数不能被继承,但它们的行为会影响派生类的对象
  • 如果没有显式定义构造函数和析构函数,编译器会生成默认的构造函数和析构函数
  • 构造函数可以是常量成员函数(const),但析构函数不能是常量成员函数
  • 析构函数应该小心地释放对象占用的所有资源,以避免资源泄漏

原文地址:https://blog.csdn.net/weixin_48158964/article/details/142717278

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!