Можно ли перегрузить конструктор приватным конструктором с такими же параметрами?
По сути, если что-то хранит положительное целое число, то в общедоступном конструкторе это гарантирует, что положительное целое число сохраняется, тогда как в частном конструкторе проверка не выполняется.
Очевидно, этот пример не совсем подходит для использования, но иногда вы хотите создать объект внутри метода и не хотите, чтобы он тратил время на полную безопасную инициализацию; вы можете просто попросить его создать что-то сразу без специальных проверок (или более разумно выделять кучу или что-то дорогое), когда вы собираетесь выполнить их позже позже, или они просто не нужны, и метод внутри класса должен быть в состоянии использовать этот конструктор автоматически вместо другого открытого с теми же параметрами.
Вы не можете перегружать при доступе как приватный по сравнению с публичным, но вы можете перегружать подпись: количество аргументов и их типы.
Частные конструкторы довольно распространены.
Одно из них предназначено для логически «удаленного» конструктора (наконец, напрямую поддерживаемого 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.
};
Нет, вы не можете перегрузить открытый конструктор или другую функцию-член частной: только имя и типы параметров учитываются для разрешения перегрузки.
Чтобы сделать то, что вы ищете, определите приватный конструктор, который требует дополнительного 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);
с закрытым конструктором вы не можете создать экземпляр класса напрямую, вместо этого вы использовали нечто, называемое Constructor Idiom.
Другое дело, что вы не можете наследовать класс, так как класс, который хочет наследовать, не сможет получить доступ к конструктору
что вы должны сделать, это создать метод, который вызывается из конструктора для проверки