简体   繁体   中英

How to forbid the use of the default constructor in C++?

I don't want to make it possible in my program to create an object without passing arguments to the constructor.

Is there a way?

When you declare any other constructor, the compiler will not generate the default constructor for you. If you have specified a default no-argument constructor, you can make it private.

Remember that the compiler can automatically generate each of these 4 member functions for a class.

  • default no argument constructor
  • default destructor
  • copy constructor
  • assignment operator

But it will not generate a default one if you have declared one yourself, ie, if you declared a constructor yourself, it will not create the default constructor. If you didn't declare any of the other 3 though, the compiler can generate them.

edit: Note that this information applies to C++03, but it is different in C++11 as Matthieu M. mentions in the comments. C++11 also allows for the constructor to be explicitly forbidden. See Offirmo's answer .

While the other answers are true, there is a new technique in C++11 for expressing that : deleted default constructor

It allows forbidding a function without depending on any other trick. It also clearly express your intention in the code.

class X
{ 
public:
    X(int) {}
    X() = delete; // will never be generated
};

int main()
{ 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;
}

Define a constructor taking the correct argument(s). This will prevent the compiler from defining a default constructor.

class X { 
public:
   X(int) {}
};

int main(){ 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;
}

The reason why you can create an object without passing arguments to the constructor is that you have a default constructor. A default constructor is a kind of constructor which doesn't have a parameter or all parameters having default values. And if you didn't declare any constructor, the compiler will make one for you. So, the solution is very easy. You can declare a constructor with a parameter without default value, then the compiler won't bother to make the constructor to you.

创建一个非空的构造函数会“取消”默认的空构造函数,因此,如果您未明确创建一个空的构造函数,则不提供参数就不会创建任何对象。

创建一个私有的默认构造函数。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM