为什么私有构造函数阻止对象创建 C++

why private constructor prevents object creation C++

我一直读到私有构造函数阻止对象创建。 我在单例模式中使用过它们,我知道如何在使用私有构造函数(使用静态方法等)时创建对象。 我知道构造函数是用来初始化对象的。

但我不明白是什么让私有构造函数阻止对象创建。 如果我的对象没有初始化怎么办。我的意思是它应该抛出一些垃圾,但为什么它会限制 ??

我已经检查了 Whosebug 中的所有现有答案,但我没有得到确切的概念。

C++ 不允许在不调用构造函数的情况下创建对象。而如果构造函数不可访问,则无法完成创建。对象的生命周期定义在构造函数和析构函数的调用之间。

您当然可以分配原始内存并将其转换为指向对象类型的指针(如 C 中所做的那样),但您不会拥有该 class 的对象。在调用构造函数将原始内存区域转换为对象表示之前,该内存区域不正式包含对象。

因为你不能从 class 外部调用私有 class 方法,如果构造函数是私有的,那意味着你不能创建 [=14= 的实例],因为创建对象需要调用构造函数。

在这方面,构造函数与任何其他 class 方法没有什么不同。如果 class 方法是私有的,那么您已经明白不能从 class 外部调用它。并且由于必须调用构造函数来构造 class 的实例,因此使用私有构造函数。

将构造函数标记为私有会阻止 对象创建的说法是不正确的。它所做的只是 限制 对象创建到 class 内的代码,只有私有构造函数。你可以创建一个新对象,而其他人不能。

这对单例很有效,因为它可以帮助您确保您的单例仍然是 class.

的唯一实例

class 私有范围不会阻止 class 实例化,但实际上它限制 "who" 可以创建对象。

它就像其他私有范围的成员数据一样,不能从外部访问,但只能用于 accessorsgetters 以及其他 `friend 函数和 classes:

#include <iostream>
using namespace std;

class Foo
{
    public:
        Foo(int x) : value(x){ cout << "Foo(int) public ctor" << endl;} // ctor

        void SetValue(int x) {value = x;}  // setter
        int  GetValue()const{return value;}// getter

    private:
        int value;
        Foo(){ cout << "Foo() private ctor" << endl;} // private ctor

        friend ostream& operator<<(ostream& out, Foo& rhs)
        {
            out << rhs.value;
            return out;
        }
        friend Foo* CreateObject();
};

Foo* CreateObject()
{
    Foo* ptrFoo = new Foo;
    return ptrFoo;
}


int main ()
{

    //Foo theFoo;     // error C2248: 'Foo::Foo' : cannot access private member declared in class 'Foo'
    Foo theFoo2(0); // ok
//  cout << theFoo2.value << endl; // error C2248: 'value' : cannot access private member declared in class 'Foo'
    cout << theFoo2.GetValue() << endl; // ok
    cout << theFoo2 << endl;

    Foo* ptrFoo = CreateObject();
    ptrFoo->SetValue(7);
    cout << ptrFoo->GetValue() << endl;


    cout << endl;
    return 0;
}

要在 C++ 中创建对象,需要调用构造函数。如果需要调用的构造函数不可访问,则无法调用,也就无法创建对象。

private 构造函数的要点不是阻止 对象构造。它是关于控制哪些代码可以访问构造函数,从而限制哪些代码创建作为该 class 实例的对象的代码。 class 的所有成员函数(static 或其他)以及 class 的所有声明的 friend 都可以访问 private 构造函数(可能是单独的函数,或其他 classes) - 所以这些中的任何一个都可以使用 private 构造函数创建 class 的实例(假设构造函数已定义)。

如果无法调用构造函数,则无法初始化对象。毕竟,构造函数的工作是初始化对象。但是如果构造函数是不可访问的,那么就不能构造对象,所以不可能有未初始化的对象。

当然,没有什么可以阻止 class 拥有多个具有不同访问控制的构造函数(privateprotectedpublic)。可以通过任何代码使用该构造函数构造具有 public 构造函数的 class。但是任何尝试使用 private 构造函数(由非成员非 friend)仍将被拒绝。因此,访问控制允许(开发者)class 对实例的构建方式进行某种程度的控制。

不定义(即不实现)构造函数确实会阻止对象的构造。如果该构造函数是 private,编译器将拒绝调用它的尝试(除非尝试创建实例的函数是成员或 friend,如上所述)。对于 class 的成员和朋友,编译器将允许访问构造函数,但是(在典型的先编译后 link 工具链中)link 成员不会构建可执行文件,因为它无法解析对未定义函数的调用。使用标记构造函数 private 而不是定义它的技术是防止代码构造 class 实例的常用方法(通过阻止代码编译,或阻止它 运行).