1,第四章

2062 ワード

初期化とパージ:
1.c++では、初期化が重要すぎるため、ユーザーに残しておくことはできません.クラスの設計者は、コンストラクション関数という特殊な関数を提供することで、各オブジェクトが正しく初期化されることを保証することができます.クラスにコンストラクション関数がある場合、コンパイラはオブジェクトを作成するときにこの関数を自動的に呼び出します.これは、ユーザーがオブジェクトを使用する前に完了しています.
Class X{
  int a;
public:
 x();//    
};

int main()
{
 X a;
}

この場合、aは整数のように、このオブジェクトにメモリを割り当てます.しかし、プログラムがaの定義点に実行されると、コンストラクション関数は自動的に呼び出され、コンパイラがaの定義点にX::X()の呼び出しをこっそり挿入したと考えられる.
コンストラクション関数と解析関数は2つの非常に特殊な関数です.彼らは戻り値を持っていません.これは戻り値がvoidであることとは明らかに違います.プログラム内でオブジェクトを作成して除去する動作は非常に特殊で、生と死のように、常にコンパイラによってこれらの関数が呼び出されて実行されることを保証します.もしそれらに戻り値がある場合、コンパイラは戻り値をどのように処理するかを知らなければならないか、ユーザー自身が表示する呼び出し構造関数と構造関数しか表示できません.そうすれば、安全性が破壊されました
2.オブジェクトが定義範囲を超えた場合、コンパイラは自動的に構造関数を呼び出します.オブジェクトの定義点で構造関数が呼び出されますが、構造関数呼び出しの唯一の根拠は、goto文を使用してこのブロックから飛び出しても、オブジェクトを含む右かっこです.
#include <iostream>
using namespace std;

class tree
{
	int height;
public:
	tree(int initialHeight);
	~tree();
	void grow(int years);
	void printsize();
};

tree::tree(int initialHeight)
{
	height = initialHeight;
}
tree::~tree()
{
	cout<<"inside tree destructor"<<endl;
	printsize();
}

void tree::grow(int years)
{
	height += years;
}

void tree::printsize()
{
	cout<<"tree height is: "<<height<<endl;
}

int main(void)
{
	cout<<"before opning brace"<<endl;
	{
		tree t(12);
		cout<<"after tree creation"<<endl;
		t.printsize();
		t.grow(4);
		cout<<"before closing brace"<<endl;  //            
	}
	cout<<"after closing brace"<<endl;
	return 0;
}


    :
before opning brace
after tree creation
tree height is: 12
before closing brace
inside tree destructor
tree height is: 16   //            
after closing brace
Press any key to continue

3.集合初期化
Class X
{
int i,j;
public:
X(int I,int J)
{
  i = I;
  j = J;
}
};

int main()
{
   X xx[] = {X(1,2),X(3,4),X(5,6),X(7,8)};
}