簡體   English   中英

私有構造函數為什么會阻止對象創建C ++

[英]why private constructor prevents object creation C++

我一直讀到私有構造函數阻止對象創建。 我在單例模式中使用它們,我知道如何在使用私有構造函數(使用靜態方法等)時創建對象。 我知道構造函數用於初始化對象。

但我不明白究竟是什么讓私有構造函數阻止對象創建。 如果我的對象沒有初始化怎么辦? 我的意思是它應該扔一些垃圾,但為什么它限制?

我已經檢查了stackoverflow中的所有現有答案,但我沒有得到確切的概念。

將私有構造函數標記為阻止對象創建是不正確的。 它所做的就是對象創建限制在只有私有構造函數的類中的代碼中。 您可以創建新對象,而其他人則不能。

這適用於單身人士,因為它可以幫助您確保您的單身人士仍然是班級的唯一實例。

class private scope不會阻止類實例化,但事實上它限制“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;
}

要在C ++中創建對象,需要調用構造函數。 如果無法訪問需要調用的構造函數,則無法調用它,並且無法創建該對象。

private構造函數的要點不是阻止對象構造。 它是關於控制哪些代碼可以訪問構造函數,因此限制哪些代碼創建作為該類的實例的對象。 private構造函數可供類的所有成員函數( static或其他)訪問,也可訪問類的所有已聲明的friend (可以是單個函數或其他類) - 因此任何這些都可以創建類的實例使用private構造函數(假設構造函數已定義)。

如果無法調用構造函數,則無法初始化該對象。 畢竟,構造函數的工作是初始化對象。 但是如果構造函數不可訪問,則無法構造對象,因此不可能有未初始化的對象。

當然,沒有什么能阻止類具有多個具有不同訪問控制( privateprotectedpublic )的構造函數。 可以使用該構造函數,通過任何代碼構造具有public構造函數的class 但任何使用private構造函數(由非成員非friend )的嘗試仍將被拒絕。 因此,訪問控制允許( class開發人員)對如何構造實例進行一些控制。

不定義(即不實現)構造函數會阻止構造對象。 如果該構造函數是private ,則編譯器將拒絕嘗試調用它(除非嘗試創建實例的函數是成員或friend ,如上所述)。 對於類的成員和朋友,編譯器將允許訪問構造函數,但是(在典型的編譯 - 然后 - 鏈接工具鏈中)鏈接器將不會構建可執行文件,因為它無法解析對未定義的函數的調用。 使用標記構造函數private而不定義它的技術是阻止代碼構造類實例的常用方法(通過阻止代碼編譯或阻止代碼運行)。

C ++不允許在不調用構造函數的情況下創建對象。 如果構造函數不可訪問,則無法完成創建。 對象的生命周期定義在構造函數和析構函數的調用之間。

您當然可以分配原始內存並將其強制轉換為指向對象類型的指針(如在C所做的那樣),但您不會擁有該類的對象。 在調用構造函數將原始內存區域轉換為對象表示之前,該內存區域不會正式包含對象。

因為您無法從類外部調用私有類方法,並且構造函數是私有的,這意味着您無法創建該類的實例,因為創建該對象需要調用構造函數。

在這方面,構造函數與任何其他類方法沒有什么不同。 如果類方法是私有的,那么您已經明白不能從類外部調用它。 並且因為必須使用私有構造函數調用構造函數來構造類的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM