📜  C++ |构造函数|问题7(1)

📅  最后修改于: 2023-12-03 15:29:51.997000             🧑  作者: Mango

C++ | 构造函数 | 问题7

问题描述:

在C++中,构造函数是一种特殊的成员函数,在创建对象时自动调用。然而,构造函数具有重载的特性,因为当在一个类中定义了多个构造函数时,编译器将根据实际参数的类型、数量和顺序选择其中一个来实例化对象。

问题7:在多个构造函数中,如何避免重复的代码?

解决方案:

在实现多个构造函数时,会发现它们的实现中有很多相同的代码,这样会导致代码冗余,增加维护难度。为了避免这种情况,可以通过以下两种方式来减少代码冗余:

1. 委托构造函数:

C++11标准中引入了委托构造函数的概念,它允许一个构造函数调用另一个构造函数,以便复用一些共同的代码逻辑,如下所示:

class MyClass {
public:
    // 构造函数1
    MyClass(int a, int b) : x(a), y(b) {}

    // 构造函数2,委托构造函数
    MyClass(int a) : MyClass(a, 0) {}

    // 构造函数3,委托构造函数
    MyClass() : MyClass(0, 0) {}

private:
    int x;
    int y;
};

在上面的代码中,构造函数2和构造函数3都调用了构造函数1,以复用共同的代码逻辑。

2. 提取公共代码至私有成员函数:

提取公共代码至私有成员函数,这是一种比较传统的方式。具体实现方法是,将需要共享的代码逻辑封装为一个私有成员函数,然后在其他构造函数中调用该函数。

class MyClass {
public:
    // 构造函数1
    MyClass(int a, int b) {
        init(a, b);
    }

    // 构造函数2
    MyClass(int a) {
        init(a, 0);
    }

    // 构造函数3
    MyClass() {
        init(0, 0);
    }

private:
    // 私有成员函数,用于初始化对象
    void init(int a, int b) {
        // 共同代码逻辑
        this->x = a;
        this->y = b;
    }

private:
    int x;
    int y;
};

在上面的代码中,init()函数封装了共同的代码逻辑,三个构造函数都调用了init()函数来进行共同的初始化操作。这样也能很好地避免代码的冗余。