6. 一个参数的构造函数

在 C++ 语言中,当创建一个对象时并且为其赋值一个初始值,则会调用具有一个参数的构造函数。

如下面的代码

Rectangle r3 = 100;

则会尝试调用 Rectangle(const int & xxx) 这样的构造函数,当然我们的示例中没有一个整数参数的构造函数则创建对象会出错。

示例

下面我们定义一个正方形类 Square 类来说明这样一个问题。

#include <iostream>

using namespace std;

class Square {
    public:
        Square(int l=1) {
            cout << "构造函数 Square(int) 被调用!" << endl;
            length = l;
        }
        Square(double l) {
            cout << "构造函数 Square(double) 被调用!" << endl;
            length = l;
        }
        double get_length(void) {
            return  length * 2;
        }
    private:
        double length;
};

当我们使用 Square 类创建对象时使用不同的创建方法则调用不同的构造函数。如下所示。

Square s1;  // 调用无参的构造函数
Square s2(100);  // 调用构造函数Square(int)
Square s3(1.2);  // 调用构造函数Square(double)
Square s4 = 200;  // 调用构造函数Square(int)
Square s5 = 3.4;  // 调用构造函数Square(double)

完整的示例代码如下:

// filename: constructor1.cpp
#include <iostream>

using namespace std;

class Square {
    public:
        Square(int l=1) {
            cout << "构造函数 Square(int) 被调用!" << endl;
            length = l;
        }
        Square(double l) {
            cout << "构造函数 Square(double) 被调用!" << endl;
            length = l;
        }
        double get_length(void) {
            return  length * 2;
        }
    private:
        double length;
};

int main(int argc, char * argv[]) {
    Square s1;  // 调用无参的构造函数
    Square s2(100);  // 调用构造函数Square(int)
    Square s3(1.2);  // 调用构造函数Square(double)
    Square s4 = 200;  // 调用构造函数Square(int)
    Square s5 = 3.4;  // 调用构造函数Square(double)

    cout << "s1的周长:" << s1.get_length() << endl;
    cout << "s2的周长:" << s2.get_length() << endl;
    cout << "s3的周长:" << s3.get_length() << endl;
    cout << "s4的周长:" << s4.get_length() << endl;
    cout << "s5的周长:" << s5.get_length() << endl;

    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -o constructor1 constructor1.cpp
weimz@mzstudio:~$ ./constructor1 
构造函数 Square(int) 被调用!
构造函数 Square(int) 被调用!
构造函数 Square(double) 被调用!
构造函数 Square(int) 被调用!
构造函数 Square(double) 被调用!
s1的周长:2
s2的周长:200
s3的周长:2.4
s4的周长:400
s5的周长:6.8

实验

验证一个参数的构造函数的编写和调用规则。