C++解析関数と変数の生存周期例の詳細

2464 ワード

C++解析関数と変数の生存周期例の詳細
この文章は構造関数を紹介して、私の読書ノートで、私はそれが十分に短くて比較的に全面的で、復習の役割を果たすことを望んでいます.C++の知識がはっきり覚えていない場合は、すぐに思い出すことができます.
構造関数(destructor)の名前はクラス名と同じですが、前に「~」を付けます.構造関数にはパラメータや戻り値がなく、もちろんリロードできません.
構造関数を呼び出すタイミング
解析関数は、オブジェクトが消滅したときに自動的に呼び出されることはよく知られていますが、実際には、関数のパラメータオブジェクトや関数の戻り値であるオブジェクトが、消滅したときに解析関数呼び出しを引き起こすことも隠されています.

#include
using namespace std;
class CNum {
public:
  int num;
  ~CNum() { cout << "destructor" << endl; }
  CNum() { num = 0; cout << "constractor CNum()" << endl; }
  CNum(CNum & n) { num = n.num; cout << "constractor CNum(CNum & n)" << endl; }
};

CNum fun(CNum n) {
  cout << "fun()start" << endl;
  n.num = 3;                //             ,      
  return n;
}

int main() {
  CNum n1;
  n1 = fun(n1);
  return 0;
}

実行結果:
constractor CNum()constractor CNum(CNum&n)/コンストラクションパラメータn fun()constractor CNum(CNum&n)/コンストラクション戻り値としての一時オブジェクトdestructor//funの戻り値は一時オブジェクトであり、一時オブジェクトの生存期間は1つの文destructor//fun()のみであり、パラメータnがdestructor//mainの終了時に局所変数n 1が消滅する
任意のキーを押して続行してください.
直接オブジェクトを渡すのではなく、関数を呼び出すときにリファレンスを使用すると、不要な関数呼び出しを何度も省くことができます.特に、この関数が頻繁に呼び出される場合です.
かそうこうぞうかんすう
構造関数は虚関数であってもよいが、構造関数はできない.构造関数は重载できると思いますが、构造関数はできません.
一般的に、クラスが虚関数を定義している場合は、構造関数も虚関数として定義することが望ましい.このような提案があるのは、ここで隠れたバグが発生しやすいからです.コードを見てください.

class CShape {
public: ~CShape() {/*     */} 
};

class CCircle :public CShape {
  public:
  CCircle() {/*       */}
  ~CCircle() {/*       */ }
};

int main() {
  CShape * ptrShape = new CCircle();
  delete ptrShape;
  return 0;
}

では、delete ptrShape;実行時にどの構造関数が実行されますか?ちょうど私たちが呼び出したい~CCircle()ではなく、何もしない~CShape()を呼び出してメモリが漏れました.このようなことを避けるために一般的な方法は,構造関数を虚関数として定義することである.つまりvirtual~CShape(){/*何もしない*/};.ベースクラスの構造関数が虚関数である限り、派生クラスの構造関数は「virtule」キーで宣言するかどうかにかかわらず、虚構造関数になります.
変数の生存期間
1)すべての変数の生存周期はプログラムの開始から最後までであり,先に定義された先生成,後消滅である.グローバル変数のコンストラクション関数はmain()に入る前に呼び出され、main()が発売されてから消滅します.
2)一時オブジェクトの生存期間は文の実行時間より大きくない.タイプ変換文や戻り文などで一時変数が発生する場合があります.
3)局所変数の生存期間は定義の開始から最近の"}"の終了までである.
4)静的局所変数は,定義文を最初に実行したときに構築され,プログラムの最後にグローバル変数が消滅する前に消滅する.
読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!