3

可以用具有相同参数的私有构造函数重载构造函数吗?

基本上,如果某个东西存储了一个正整数,那么在公共构造函数中它会确保存储了一个正整数,而在私有构造函数中它不会执行检查。

显然这个例子并不是一个真正合适的用途,但有时你想在一个方法中创建一个对象并且你不希望它浪费时间来执行完全安全的初始化;当您稍后要再次执行它们或者它们只是不必要的时候,您可能只想告诉它在没有特殊检查的情况下立即创建一些东西(或者更谨慎的堆分配或一些昂贵的东西),并且类中的方法应该能够自动使用此构造函数,而不是具有相同参数的其他公共构造函数。

4

3 回答 3

2

不,您不能用私有构造函数重载公共构造函数或另一个成员函数:只有名称和参数类型才可用于重载决议。

要执行您要查找的操作,请定义一个私有构造函数,该构造函数接受一个bool指示需要执行参数检查的附加参数:

class A {
public:
    A(int x) : A(x, true) {}
private:
    A(int x, bool check) {
        if (check) {
            // Perform the check of the x argument
        }
    }
};

为了构造一个实例并绕过检查,可以访问私有构造函数的函数调用

A aUnchecked(-123, false);

已检查的实例以通常的方式构造:

A aChecked(123);
于 2013-02-04T01:31:11.673 回答
2

您不能重载私有与公共的访问权限,但您可以重载签名:参数的数量及其类型。

私有构造函数很常见。

一种用法是用于逻辑“删除”的构造函数(最终由 C++11 直接支持),另一种用法是供公共工厂函数使用。


例子:

class A
{
public:
    A( int const x)
    {
        // Whatever, checked construction.
        // Perform the check of the x argument.
        // Then other things.
        // In C++11 it can be done by checking x and forwarding to the
        // unchecked constructor in the same class. Not shown here though.
    }

private:
    enum unchecked_t { unchecked };
    A( int const x, unchecked_t )
    {
        // Unchecked construction.
    }

    // Methods that possibly use the unchecked constructor.
};
于 2013-02-04T01:35:50.450 回答
1

使用私有构造函数,您不能直接实例化一个类,而是使用名为 Constructor Idiom 的东西。

您不能继承该类的其他事情,因为要继承的类将无法访问构造函数

你应该做的是创建从构造函数调用的方法来检查

于 2013-02-04T01:36:58.870 回答