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

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

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

在面向对象编程中,构造函数是一种特殊的成员函数,它用于创建对象时初始化该对象的数据成员。在C++中,构造函数名称与类名称相同,且没有返回类型。构造函数可以有参数,也可以没有。

问题8:如何在C++中使用默认参数和委托构造函数?

使用默认参数

默认参数是指在定义函数时为参数提供默认值,从而可以在函数调用时省略这些参数。在C++中,可以在构造函数中使用默认参数。

class MyClass {
public:
    int x, y, z;
    MyClass(int a=0, int b=0, int c=0) {
        x = a;
        y = b;
        z = c;
    }
};

上述代码中,构造函数MyClass()可以使用默认参数int a=0, int b=0, int c=0,可以通过以下方式进行调用:

MyClass obj1;      // x=0, y=0, z=0
MyClass obj2(1);   // x=1, y=0, z=0
MyClass obj3(2, 3);    // x=2, y=3, z=0
MyClass obj4(4, 5, 6); // x=4, y=5, z=6
委托构造函数

在C++11中,可以使用委托构造函数来避免构造函数之间的冗余代码。

class MyClass {
public:
    int x, y, z;
    MyClass(int a) : MyClass(a, 0) {}
    MyClass(int a, int b) : MyClass(a, b, 0) {}
    MyClass(int a, int b, int c) {
        x = a;
        y = b;
        z = c;
    }
};

上述代码中,构造函数MyClass(int a)使用了委托构造函数MyClass(int a, int b)MyClass(int a, int b)使用了委托构造函数MyClass(int a, int b, int c)。这意味着我们可以仅在最终构造函数MyClass(int a, int b, int c)中定义初始化代码,而其他构造函数可以委托彼此,以达到代码重用的目的。

使用委托构造函数也可以与默认参数结合使用。以下代码演示了一个结合了默认参数和委托构造函数的构造函数:

class MyClass {
public:
    int x, y, z;
    MyClass(int a=0, int b=0, int c=0) : MyClass(a, b, c, true) {}
    MyClass(int a, bool b) : MyClass(a, 0, 0, b) {}
    MyClass(int a, int b, bool c) : MyClass(a, b, 0, c) {}
    MyClass(int a, int b, int c, bool d) {
        if (d) {
            x = a;
            y = b;
            z = c;
        }
        else {
            x = y = z = 0;
        }
    }
};

上述代码中,我们定义了多个构造函数来支持不同的参数组合。我们使用了一个名为d的布尔类型参数来标记一个由参数初始化还是默认初始化。如果参数d为真,则使用constructorMyClass(int a, int b, int c, bool d),否则初始化xy,和z为0。