条項22:できるだけ「伝値」ではなく「伝引用」を用いる
1965 ワード
条項22:できるだけ「伝値」ではなく「伝引用」を用いる
この章の言うことは基本的にすべて掌握の範囲内で、簡単に概括します
まず効率の問題です
たとえば
単純な関数returnstudentを定義し、studentパラメータ(値を通過)を取得してすぐに返します(値も通過します).定義が完了したら、これを呼び出します.
個の関数:
簡単に言えば、まずstudentのコピー構造関数を呼び出してsをplatoに初期化する.次にstudentのコピーコンストラクション関数を再度呼び出して、関数を
数戻り値オブジェクトはsに初期化されます.次に、sの構造関数が呼び出される.最後にreturnstudentが値オブジェクトを返す構造関数が呼び出されます.だから、これは何でも
作成していない関数のコストは、2つのstudentのコピー構造関数と2つのstudent構造関数です.もちろん、メンバー変数の構造も含まれています.一連の事件を引き起こす.
串の蝶効果.
2つ目は派生クラスからベースクラスへの変換の損失です
void printnameanddisplay(window w)というインタフェースでは、高から低への変換が形成されるため、ベースクラス+派生クラスのメモリレイアウトでは、派生クラスは
切り落としてwのオブジェクトを作ります.このときdisplay()を呼び出すと、Windowsクラスのdisplay()に変わり、私たちが望んでいるダイナミックなトーンではありません.
Windowwithscrollbarsのdisplay();
この章の言うことは基本的にすべて掌握の範囲内で、簡単に概括します
まず効率の問題です
たとえば
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();