ディレクトリ
1.デストラクタ
- C ++クラスでは、文法規則をデストラクタと呼ばれる、特定のクリーニング機能で定義することができます
~ClassName()
- パラメータをデストラクタず、型宣言を返しません。
- デストラクタは、自動的にオブジェクトが破棄されるときに呼び出されます
- カスタムクラスのコンストラクタ、およびコンストラクタは(例えば:などのヒープスペース、開いているファイル、)システムリソースを使用する場合、必要がデストラクタをカスタマイズします
2.構造とオブジェクトのデストラクタのシーケンス
複数のオブジェクト間
設定時に複数のオブジェクト:
- 設定は、プログラムの実行フローのスタックオブジェクトの配列に依存します
- 建設順新しいヒープオブジェクトは、使用の順序に依存します
- 建設オーダーグローバルオブジェクトが不確実である、異なるコンパイラは異なったルールを使用することができます
ときにオブジェクトの破壊の複数:
- デストラクタシーケンスおよびスタックオブジェクトと反対のグローバルオブジェクトの構造配列
- ヒープオブジェクトは、デストラクタを発生する削除順序に依存使用
単一の内部オブジェクト
単一のオブジェクトが作成されると、内部の順序は、オブジェクトのコンストラクタを呼び出します。
- まず、親クラスのコンストラクタを呼び出します
- 次に、コンストラクタのメンバ変数を呼び出す宣言順序と同じ順序を呼び出します
- 最後に、クラス自体のコンストラクタを呼び出します
物体内部の単一の構成と逆の順序でデストラクタ配列。
3. CONSTオブジェクトのconstメンバ関数
constオブジェクト
- constキーワードオブジェクトによって変更された読み取り専用オブジェクトであります
- メンバ変数の読み取り専用オブジェクトは変更することが許可されていません
- 読み取り専用属性は、コンパイル時にのみ実行無効有効です。
constメンバ関数
constメンバ関数は次のように定義されている、ことに注意関数宣言と関数定義は、constキーワードでなければなりません。
Type ClassName :: func(Type para) const
constメンバ関数を使用するには、いくつかのルールがあります。
- constオブジェクトはconstメンバ関数を呼び出すことができます
- constメンバ関数はconstメンバ関数を呼び出すことができます
- constメンバ関数は、直接メンバ変数の値を変更することはできません
#include <stdio.h>
class Test
{
int mi;
public:
Test(int i);
void setMi(int i) const;
int getMi() const;
void printMi();
};
Test::Test(int i)
{
mi = i;
}
void Test::setMi(int i) const
{
mi = i; //Error,const成员函数中不能直接修改成员变量的值
}
int Test::getMi() const
{
return mi;
}
void Test::printMi()
{
printf("printMi(): mi = %d\n", mi);
}
int main()
{
const Test t1(1);
t1.getMi(); //OK,const对象调用const成员函数
t1.printMi(); //Error,const对象调用普通成员函数
return 0;
}
4.メンバー関数、メンバー変数とオブジェクト間の関係を
オブジェクト指向の視点のオブジェクトの属性(メンバ変数)とメソッド(メンバ関数)の構成;
から実行中のプログラムの目標角度、データおよび機能の構成データをスタック、ヒープ、またはグローバルデータエリアに位置しており、機能は、コードセグメントに位置しています。
- 各オブジェクトは、独自の独立した属性(メンバ変数)を持ちます
- すべてのメソッド(メンバ関数)の目標を共有クラス
- この方法は、直接、オブジェクトのプロパティにアクセスすることができます
- この隠されたパラメータ値の方法は、現在のオブジェクトポインタに代入します
#include <stdio.h>
class Test
{
int mi;
public:
int mj;
Test(int i);
Test(const Test &t);
int getMi();
void print();
};
Test::Test(int i)
{
mi = i;
}
Test::Test(const Test &t)
{
mi = t.mi; //成员函数可以直接访问对应类对象的成员变量
}
int Test::getMi()
{
return mi;
}
void Test::print()
{
printf("this = %p\n", this); //每个成员函数中隐藏了一个this指针,用于指向当前对象
}
int main()
{
Test t1(1);
Test t2(2);
Test t3(3);
printf("t1.getMi() = %d\n", t1.getMi());
printf("&t1 = %p\n", &t1);
t1.print();
printf("t2.getMi() = %d\n", t2.getMi());
printf("&t2 = %p\n", &t2);
t2.print();
printf("t3.getMi() = %d\n", t3.getMi());
printf("&t3 = %p\n", &t3);
t3.print();
return 0;
}
実際のコード - 配列クラスIntArray
IntArray.h
#ifndef _INTARRAY_H_
#define _INTARRAY_H_
class IntArray
{
private:
int m_length;
int *m_pointer;
public:
IntArray(int len);
IntArray(const IntArray &obj);
int length();
bool get(int index, int &value);
bool set(int index ,int value);
~IntArray();
};
#endif
IntArray.cpp
#include "IntArray.h"
IntArray::IntArray(int len)
{
m_pointer = new int[len];
for(int i=0; i<len; i++)
{
m_pointer[i] = 0;
}
m_length = len;
}
IntArray::IntArray(const IntArray &obj)
{
m_length = obj.m_length;
m_pointer = new int[obj.m_length];
for(int i = 0; i < obj.m_length; i++)
{
m_pointer[i] = obj.m_pointer[i];
}
}
int IntArray::length()
{
return m_length;
}
bool IntArray::get(int index, int &value)
{
bool ret = (0 <= index) && (index < length());
if( ret )
{
value = m_pointer[index];
}
return ret;
}
bool IntArray::set(int index, int value)
{
bool ret = (0 <= index) && (index < length());
if( ret )
{
m_pointer[index] = value;
}
return ret;
}
IntArray::~IntArray()
{
delete[] m_pointer;
}
IntArrayテスト
#include "IntArray.h"
#include <stdio.h>
int main()
{
IntArray a(5);
for(int i = 0; i < a.length(); i++)
{
a.set(i, i + 1);
}
for(int i = 0; i < a.length(); i++)
{
int value = 0;
if( a.get(i, value) )
{
printf("a[%d] = %d\n", i, value);
}
}
IntArray b = a;
for(int i = 0; i < b.length(); i++)
{
int value = 0;
if( b.get(i, value) )
{
printf("b[%d] = %d\n", i, value);
}
}
return 0;
}