2013-07-06 2 views
6

私は最近、第1巻を読み終えました。 Bruce EckelのC++でのThinkingについて学び、知識を実用に供することに変わりました。コンストラクタをC++で静的として宣言できないのはなぜですか?

私は最近、静的メンバー関数を使って作業していましたが、コンパイラが不安定なコンストラクタを静的にしようとしました。私は本の理由を調べたが、何も見つけられなかった。

誰でも理由を説明できますか?

P .:いくつかの回答を見た後、C#(およびJava)がコンストラクタを静的として宣言できるという私の知識から、混乱が生じることを言いたいと思います。

+5

最初に、静的なコンストラクタで何をすると思いますか?不足している機能の確かな理由が見つからない場合は、それを持つのは何ですか? –

+0

私は、そのクラスのコンストラクタを直接呼び出してオブジェクトを作成することで、ハックするでしょう。私は静的なのは、すべてのメンバーオブジェクトを静的に強制することを知っていますが、唯一の理由ですか? – Sankalp

+0

クラスのコンストラクタを静的でなくても直接呼び出すことができます。 –

答えて

11

コンストラクタの目的は、のインスタンス、クラスのインスタンスを初期化することです。

スタティックメソッドにはインスタンスが関連付けられていません。

したがって、静的コンストラクタのようなものはありません。

+1

まあC++は静的コンストラクタをC#と同じ方法で定義することも、静的初期化ブロックを使ってJavaを定義することもできます。静的コンストラクタは、特にそれ自身では非感覚ではありません。 – log0

+3

@ log0リンカーンは言ったように、あなたは尾を足と呼んでも犬は4本の脚しか持っていません。 MSが何を呼び出すかにかかわらず、C#のクラス初期化子はコンストラクタではありません。 「静的なコンストラクタ」は本当にナンセンスです。 C++では、コンストラクタのような構文やJavaのような構文、あるいはクラス初期化子を提供するための他の構文を将来使用することができますが、どのような構文を使用してもコンストラクタではありません。 –

+0

@JimBalter:あなたのアイデアを楽しむために、思考のためのいくつかの食べ物があります:実際には、「コンストラクタ」という単語は、** C++、C#、Javaなどのすべてのケースで**正しくありません。 Pythonです:初期化子( '__init__')は、C++、C#、Javaなどで"コンストラクタ "とまったく同じことを行います。つまり、インスタンスフィールドを初期化します。これとは対照的に、本当の "コンストラクタ"はPythonの '__new__'に相当します - その"建設 "仕事はメモリを(おそらくC++の' new'やCの 'malloc'を介して)割り当て、イニシャライザ*(これを "コンストラクタ"と呼ぶ)を呼び出します。 – Mehrdad

1

このような機能は提供されませんが、間接的にシミュレートできます。詳細は、this answerを参照してください。あなたがなぜこのようなことをする必要があるのか​​、私は本当に確信していません。

0

コンストラクタメンバ関数は、既存の割り当てを使用して指定されたとおりにオブジェクトを構築します。つまり、thisが存在します。

staticメンバ関数はオブジェクトへの格納を指定しないため、構築するインスタンスはありません。つまり、thisは存在しません。したがって、静的コンストラクタを指定することはできません。

はおそらく、あなたは値によってインスタンスを返すという名前の静的メンバ関数を探しています:C以上のC++の

class t_object { 
public: 
    static t_object Func(…optional parameter list…) { 
    t_object result(…ctor parameters…); 
    …initialize result… 
    return result; 
    } 
    ... 
}; 
0

1つの非常に便利な機能は、それがときに適切な初期化とクリーンアップのための適切な方法を提供していますユーザーが定義した型のインスタンスが作成され、整形済みのオブジェクトを処理する準備が整います。

この言語は、コンストラクタとデストラクタのメカニズムによってこれを実現します。

コンストラクタとデストラクタが存在する理由は、作成されたインスタンスをメンテナンスするためです。

今すぐstaticは、すべてのオブジェクトが使用できる共通のものがある場合に使用されるか、少なくとも使用されます。作成するクラスのすべてのインスタンス間で実際に共有されるものがある場合に使用します。

また、クラスの静的データメンバーへのインターフェイスは、主に静的データメンバーで使用される静的メンバー関数によって提供されます。

コンストラクタを静的にすることが許可されている場合、それを静的にすることによって与えられた定義が、画像に入った理由の行にstillとなるようにすることができます(オブジェクトを適切に初期化するあなたがそれを手に入れる前に)。したがって、オブジェクトが存在しない場合、コンストラクタ/デストラクタを持つことは理にかなっていません。

上記の行を考えると、少なくともこの場合(C++では)コンストラクタを静的にすることはできません。したがって、この言語ではサポートされていません。

関連する問題