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

时间:2016-12-28 11:33:20

标签: c++ private-constructor

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

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

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

5 个答案:

答案 0 :(得分:4)

将私有构造函数标记为阻止对象创建是不正确的。所有这一切都是限制对象创建到类中的代码,只有私有构造函数。您可以创建一个新对象,而其他人则可以。

这适用于单身人士,因为它可以帮助您确保您的单身人士仍然是该班级的唯一实例。

答案 1 :(得分:4)

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

它就像私有作用域的其他成员数据一样,不能从外部访问,只能用于accessorsgetters以及其他`朋友函数和类:

#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;
}

答案 2 :(得分:3)

要在C ++中创建对象,需要调用构造函数。如果无法访问需要调用的构造函数,则无法调用它,并且无法创建该对象。

private构造函数的要点不是阻止对象构造。它是关于控制哪些代码可以访问构造函数,因此限制哪些代码创建作为该类的实例的对象。类的所有成员函数(private或其他)都可以访问static构造函数,并且可以访问类的所有已声明的friend(可以是单个函数,也可以是其他类) - 所以任何人都可以使用private构造函数创建类的实例(假设构造函数已定义)。

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

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

因为您无法从类外部调用私有类方法,并且构造函数是私有的,这意味着您无法创建类的实例,因为创建对象需要构造函数被叫。

在这方面,构造函数与任何其他类方法没有什么不同。如果一个类方法是私有的,你已经明白你不能从课外调用它。并且因为必须使用私有构造函数来调用构造函数来构造类的实例。