类构造函数,超载构造函数和对象初始化

Class constructors, overloaded constructors and object initialization

本文关键字:构造函数 对象 初始化 超载      更新时间:2023-10-16

来自C 教程,章节(i),超载构造函数:

但是此示例还介绍了一个特殊的构造函数:默认构造函数。默认构造函数是不使用参数的构造函数,这很特别,因为在声明对象但未使用任何参数初始化对象时称呼它。在上面的示例中,默认构造函数用于RECTB。请注意,甚至没有用空括号组构建RecTB - 实际上,空括号无法使用默认构造函数:

Rectangle rectb;   // ok, default constructor called
Rectangle rectc(); // oops, default constructor NOT called 

这是因为括号的空括号将构成rectc a函数声明而不是对象声明:它将是一个不进行参数并返回类型矩形的值的函数。

所以,据我了解:

class someclass {
    public:
        someclass() {
            std::cout << "Default constructor" << std::endl;
        }
        someclass(int arg) {
            std::cout << "Constructor that uses passed argument (" << arg << " in this case)" << std::endl;
        }
};

int main() {
    someclass object1;
    //outputs "Default constructor"
    someclass object2(1294);
    //outputs "Constructor that uses passed argument (1294 in this case)"
}

但是如何定义一个称为someclass object();的构造函数?我的想法是 someclass(void) {}(不确定这一点)或为参数使用默认值(someclass(int arg = 1294) {}),但是如何正确处理这种情况?

您可以使用冗长的构造方式:

 someclass object1 = someclass();

someclass object();不会呼叫,因为编译器认为它是一个不进行参数并返回 someClass 实例的函数的声明。