2013-06-02 14 views
5

Cprogramming.comのランダムページを辿って、Constructors and Destructorsチュートリアル/サンプルページに気付いただけです。私は魔法thisポインタでコンストラクタの良い昔ながらの定義を使用してきたこのコンストラクタ定義の利点は何ですか

class String 
{ 
    private: 
     char *str; 
     int size; 
    public: 
     String() : str(NULL), size(0) { } // <- This statement 
     String(int size) : str(NULL), size(size) { // <- And this one 
      str = new char[size]; 
     } 
} 

:彼らは、コンストラクタを定義する以下の方法を使用している

String() { 
    this->str = NULL; 
    this->size = 0; 
} 
String(int size) { 
    this->size = size; 
    this->str = new char[size]; 
} 

任意の付加的な利点があります明白な小さなコード(行数が少ない)の横にある最初の宣言では?

PS:最後にC++で何かを書いてからかなりの年月が経ちました。

+1

http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list –

答えて

11

ものはconstructor initialization listsあり、基本タイプため割り当てなく、初期化に基づいて次の作業を行うように使用される形態、に対して差はありません。

しかし、ユーザ定義型のための(おそらく及びセマンティクス)性能の点で違いがあるかもしれません間:

  1. それに値を割り当てるオブジェクト、次いでデフォルト-構築、および
  2. その値で直接初期化します。

また、あなたはそれらを初期化するメンバ初期化リストを使用した以外、構成可能デフォルトされていない、とあなたはどちらかconstのための選択と基準部材を持たないタイプのための選択、その必須を持っていませんすぐに初期化される。 C++でオブジェクトを構築

0

は3通の段階で行われます。

  1. メモリは
  2. メンバ変数が
  3. コンストラクタが実行される初期化さ後天されます。

コンストラクタ定義String() : str(NULL), size(0) {}コンストラクタ定義String() { this->str = NULL; this->size = 0; }手順3手順2でこれを行う2

ステップで変数に適切な値を代入し、しかし、それにもかかわらず実行されます。したがって、メンバー変数に適切な値を割り当てるこの種のものは効率が悪いです。

1

私はあなたのようなものでした。古いコラージュの知識でこの使用法は奇妙に見えます。しかし、このテクニックを使用することで、カスタムクラスの実装は実行時により良いパフォーマンスを提供することを理解しています。 hereは、C++の父親からの初期化リストについての長い説明です。

関連する問題