条項22:できるだけ「伝値」ではなく「伝引用」を用いる

1965 ワード

条項22:できるだけ「伝値」ではなく「伝引用」を用いる
この章の言うことは基本的にすべて掌握の範囲内で、簡単に概括します
まず効率の問題です
たとえば
class person {
public:
  person();                         //  , 
                                    // 
  ~person();

  ...

private:
  string name, address;
};

class student: public person {
public:
  student();                        //  , 
                                    // 
  ~student();

  ...

private:
  string schoolname, schooladdress;
};

単純な関数returnstudentを定義し、studentパラメータ(値を通過)を取得してすぐに返します(値も通過します).定義が完了したら、これを呼び出します.
個の関数:

student returnstudent(student s) { return s; }

student plato;                      // plato( ) 
                                    // socrates( ) 

returnstudent(plato);               //  returnstudent

簡単に言えば、まずstudentのコピー構造関数を呼び出してsをplatoに初期化する.次にstudentのコピーコンストラクション関数を再度呼び出して、関数を
数戻り値オブジェクトはsに初期化されます.次に、sの構造関数が呼び出される.最後にreturnstudentが値オブジェクトを返す構造関数が呼び出されます.だから、これは何でも
作成していない関数のコストは、2つのstudentのコピー構造関数と2つのstudent構造関数です.もちろん、メンバー変数の構造も含まれています.一連の事件を引き起こす.
串の蝶効果.
2つ目は派生クラスからベースクラスへの変換の損失です
class window {
public:
  string name() const;             //  
  virtual void display() const;    //  
};

class windowwithscrollbars: public window {
public:
  virtual void display() const;
};

void printnameanddisplay(window w)
{
  cout << w.name();
  w.display();
}

windowwithscrollbars wwsb;

printnameanddisplay(wwsb);

void printnameanddisplay(window w)というインタフェースでは、高から低への変換が形成されるため、ベースクラス+派生クラスのメモリレイアウトでは、派生クラスは
切り落としてwのオブジェクトを作ります.このときdisplay()を呼び出すと、Windowsクラスのdisplay()に変わり、私たちが望んでいるダイナミックなトーンではありません.
Windowwithscrollbarsのdisplay();