C ++コンストラクタまたはデストラクタがプライベート(ターン)として定義されている

通常、コンストラクタ/デストラクタの宣言はパブリックセクションにありますが、プライベートの場合はどうなりますか?

では、プライベートコンストラクタはどのように使用できますか?2つの方法:

1、使用友元类的对象中的方法来创建它。
2、在本类中实现static方法来创建它。

(1)コンストラクタはプライベートを定義します

プログラムでオブジェクトをインスタンス化するために、コンパイラーはコンストラクターを呼び出します。コンストラクターがプライベートの場合、プライベートメンバーへのアクセスはクラス外では許可されないため、コンパイルは失敗します。

この問題を解決するには?

对于类本身,可以利用static公有成员,因为它独立于class对象之外,不必构造对象就可以使用它们!在某个static函数中创建该class的对象,并以引用或指针的形式将其返回(不以对象返回,主要是构造函数是私有的,外部不能创建临时对象),就获得了这个对象的使用权。

問題:

static成员函数貌似不可以访问非static成员,为什么却可以访问私有的构造函数?

【例】

class OnlyHeapClass
{
public:
    static OnlyHeapClass* GetInstance()
    {
        // 创建一个OnlyHeapClass对象并返回其指针
        return (new OnlyHeapClass);
    }
   void Destroy();
private:
    OnlyHeapClass() {}
    ~OnlyHeapClass() {}
};
int main()
{
    OnlyHeapClass *p = OnlyHeapClass::GetInstance();
    ... // 使用*p
    delete p;
    return 0;
}

// GetInstance()作为OnlyHeapClass的静态成员函数来在内存中创建对象:由于要跨函数传递并且不能使用值传递方式,所以选择在堆上创建对象,这样即使GetInstance()退出,对象也不会随之释放,可以手动释放。
// 构造函数私有化的类的设计保证了其他类不能从这个类派生或者创建类的实例。

そのような用途があります:

例如,实现这样一个class:它在内存中至多存在一个,或者指定数量个的对象(可以在class的私有域中添加一个static类型的计数器,它的初值置为0,然后在GetInstance()中作些限制:
每次调用它时先检查计数器的值是否已经达到对象个数的上限值,如果是则产生错误,否则才new出新的对象,同时将计数器的值增1。
最后,为了避免值复制时产生新的对象副本,除了将构造函数置为私有外,复制构造函数也要特别声明并置为私有。

コンストラクターがProtectedとして設計されている場合、同じ目的を達成できますが、継承できます。(サブクラスのコンストラクターが親クラスのプライベートコンストラクターを呼び出す場合は誤りであり、サブクラスのコンストラクターが親クラスのパブリックまたは保護されたコンストラクターを呼び出す場合は誤りです。)

(2)デストラクタプライベート

新しいクラスオブジェクトのみがヒープ上で新しくなることを確実にする方法は?デストラクタをプライベートメンバーとして定義するだけです。

理由:

C++是一个静态绑定的语言。在编译过程中,所有的非虚函数调用都必须分析完成。即使是虚函数,也需检查可访问性。因些,当在栈上生成对象时,对象会自动析构,也就说析构函数必须可以访问。
而堆上生成对象,由于析构时机由程序员控制,所以不一定需要析构函数。保证了不能在栈上生成对象后,需要证明能在堆上生成它。这里OnlyHeapClass与一般对象唯一的区别在于它的析构函数为私有。

那么如何释放它呢?答案也很简单,提供一个成员函数,完成delete操作。在成员函数中,析构函数是可以访问的。当然detele操作也是可以编译通过。 
void OnlyHeapClass::Destroy() { 
        delete this; 
} 

コンストラクターのプライベートクラスの設計により、新しいコマンドを使用してヒープ上にオブジェクトを生成できるだけであり、オブジェクトを動的に作成することしかできないため、オブジェクトのライフサイクルを自由に制御できます。ただし、そのようなクラスは、作成と取り消しのための共通のインターフェースを提供する必要があります。

転載:http :
//www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html

おすすめ

転載: www.cnblogs.com/vivian187/p/12708262.html