当前位置:首页 C++ > 正文

c++派生类对象被创建时,默认成员函数是如何被调用的?什么情况下需要手动添加默认成员函数?

作者:野牛程序员:2024-01-03 13:38:56 C++阅读 2641

派生类对象被创建时,默认成员函数的调用方式取决于派生类是否提供了自己的构造函数和析构函数。在C++中,如果派生类没有显式定义构造函数和析构函数,那么编译器会自动生成默认的构造函数和析构函数。以下是一些情况的说明:

  1. 默认构造函数:

    class Base {
    public:
        Base() {
            // 基类的默认构造函数
        }
    };
    
    class Derived : public Base {
        // 没有显式定义构造函数
    };
    
    int main() {
        Derived derivedObj;  // 先调用Base类的默认构造函数,然后调用Derived类的默认构造函数
        return 0;
    }
    • 如果派生类没有定义任何构造函数,那么编译器会为派生类生成默认构造函数。在创建派生类对象时,会先调用基类的默认构造函数,然后调用派生类的默认构造函数(如果存在)。

  2. 有参构造函数:

    class Base {
    public:
        Base(int value) {
            // 基类的有参构造函数
        }
    };
    
    class Derived : public Base {
    public:
        Derived(int value) : Base(value) {
            // 派生类的有参构造函数,显式调用基类的构造函数
        }
    };
    
    int main() {
        Derived derivedObj(42);  // 调用Base类的有参构造函数,然后调用Derived类的有参构造函数
        return 0;
    }
    • 如果派生类定义了有参构造函数,但没有显式调用基类构造函数,那么编译器会自动调用基类的默认构造函数。如果需要调用基类的有参构造函数,就需要在派生类的初始化列表中显式调用。

  3. 手动添加默认成员函数:

    class Base {
    public:
        Base() {
            // 基类的默认构造函数
        }
    };
    
    class Derived : public Base {
    public:
        Derived() {
            // 派生类的默认构造函数,可以在这里添加特定操作
        }
    
        ~Derived() {
            // 派生类的析构函数,可以在这里添加特定操作
        }
    };
    
    int main() {
        Derived derivedObj;  // 先调用Base类的默认构造函数,然后调用Derived类的默认构造函数
        // ...
        return 0;
    }
    • 如果派生类需要在构造函数或析构函数中执行一些特定的操作,就需要手动添加相应的构造函数和析构函数。这种情况下,编译器不会自动生成默认的构造函数和析构函数。

总之,派生类对象的默认成员函数的调用取决于派生类是否提供自己的构造函数和析构函数,以及是否显式调用基类的构造函数。在一些特定的场景下,手动添加默认成员函数可以确保在对象创建和销毁时执行特定的操作。

#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base class default constructor" << std::endl;
    }

    Base(int value) {
        std::cout << "Base class parameterized constructor with value: " << value << std::endl;
    }

    ~Base() {
        std::cout << "Base class destructor" << std::endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << "Derived class default constructor" << std::endl;
        // 可以在这里添加派生类特定的操作
    }

    Derived(int value) : Base(value) {
        std::cout << "Derived class parameterized constructor with value: " << value << std::endl;
        // 可以在这里添加派生类特定的操作
    }

    ~Derived() {
        std::cout << "Derived class destructor" << std::endl;
        // 可以在这里添加派生类特定的操作
    }
};

int main() {
    std::cout << "Creating Base object:" << std::endl;
    Base baseObj;  // 调用Base类的默认构造函数

    std::cout << "\\nCreating Derived object with default constructor:" << std::endl;
    Derived derivedObj;  // 先调用Base类的默认构造函数,然后调用Derived类的默认构造函数

    std::cout << "\\nCreating Derived object with parameterized constructor:" << std::endl;
    Derived derivedObjWithValue(42);  // 调用Base类的有参构造函数,然后调用Derived类的有参构造函数

    // 对象超出作用域时会调用析构函数
    return 0;
}


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击