C ++类,默认构造函数

时间:2017-12-05 23:05:04

标签: c++ visual-studio

为了保持简单和重点,我有一个班级

class square
{
public:
    square(int s); // parameterized constructor with default parameter = 0
    square(); 

private:
    int side; // holds the side of the square (whole number)
};

square::square() {

    side = 0; 
}

square::square(int s){

    side = 0; // parameterized constructor with default parameter = 0
}

在主要内容中我有以下内容:

int main()
{
    square sq1;// declare 4 objects of type square named sq1, sq2, sq3, and sq4 initializing the third one to 10
    square sq2;
    square sq3(10);
    square sq4;
}

问题是,如果我注释掉square();在课堂上,方形sq1,sq2和sq4不会起作用。 我需要将square(int s)初始化为默认构造函数设置为0,并且仅对所有四平方sq使用它。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

完全删除默认构造函数(square();)并修改参数化构造函数定义,如下所示。

square::square(int s = 0) {

    side = s; // parameterized constructor with default parameter = 0
}

答案 1 :(得分:0)

在任何情况下,您都必须定义默认构造函数。来自C ++(2017)标准(15.1构造函数)

  

4 类X的默认构造函数是类X的构造函数   非函数参数包的每个参数都有一个   默认参数(包括没有的构造函数的情况)   参数)。如果类X没有用户声明的构造函数,则a   隐式声明没有参数的非显式构造函数   违约(11.4)。隐式声明的默认构造函数是一个   同类的内联公共成员。

因此,为了使带参数的构造函数成为默认构造函数,只需在构造函数的声明中提供一个默认参数。例如

class square
{
public:
    square(int s = 0 ); // parameterized constructor with default parameter = 0

private:
    int side; // holds the side of the square (whole number)
};

构造函数本身可以定义为

square::square( int s ) : side( s )
{
}

此外,您可以使用函数说明符explicit声明构造函数,以防止从类型int隐式转换为类型square

class square
{
public:
    explicit square(int s = 0 ); // parameterized constructor with default parameter = 0

private:
    int side; // holds the side of the square (whole number)
};