C++ 型システム (Modern C++)
型 の概念は C++ で非常に重要です。変数、関数の引数と関数の戻り値は型をコンパイルする必要があります。または、すべての式は、リテラル値 (など) は、暗黙的に評価する前に、その型が与えられます。型の例として、浮動小数点値 (スカラー型 とも呼ばれます)、またはテキストを格納するために標準ライブラリのクラス std::basic_string を格納するために必要な、double 値を格納するように int が含まれます。class か structを定義することで、独自の型を作成できます。(ビット パターンとして) 型は、値が解釈されるとしてで実行できる操作する可能性のある変数に割り当てるメモリ容量 (または式の結果) について、その変数に格納されている種類の値を指定します。ここでは、C++ の型システムの主要な機能の共同の概要を示します。
用語
変数: データへのアクセスに名前を使用できるように、データ量の文字名は、定義されるコードのスコープで参照します。C++ ではスカラー型のインスタンスを示すために、他の型のインスタンスが通常は "オブジェクト" と呼びます。"変数" に一般的に使用されます。
[オブジェクト]: 簡略化のために、一貫性、ここでは、クラスまたは構造体のインスタンスを参照するために "" という用語は、オブジェクトを使用して一般的に使用されるとすべての型は、スカラー変数が含まれています。
POD 型 (plain old data) : C++ データ型の共同このカテゴリはスカラー (基本型"を参照してください) POD のクラスである型を示します。POD のクラスには、POD ではないなく、ユーザー定義のコンストラクター、ユーザー定義のデストラクター、またはユーザー定義の代入演算子がありません静的データ メンバーが。また、POD のクラスに仮想関数が、基本クラス、およびプライベートまたはプロテクトの非静的データ メンバーはありません。POD 型 (モジュールを含む外部データ交換のためによく使用されます。たとえば、書き込まれる POD 型だけです) に C 言語。
変数と関数の型の指定
C++ では、厳密に型指定された 言語であり、静的型指定されています; すべてのオブジェクトには、型があり、その型は変化しません (静的データのオブジェクトとは違います)。
コード内の変数を宣言する場合 型を明示的に指定すると、コンパイラで初期化子から型を推論するように指示するために auto のキーワードを使用します。
値が関数で返すコード内の関数を宣言する場合 各引数と戻り値の型、または void を指定する必要があります。例外は、任意の型の引数を使用する関数テンプレートを使用している場合です。
最初に変数を宣言した後、いくつかの後型は変更できません。ただし、別の型の別の変数に変数の値または関数の戻り値をコピーできます。このような操作が必要ですが、呼び出されたとき、または incorrectness データ損失の可能性があるの 型変換とです。
POD 型の変数を宣言するときは、厳密に初期化、初期値を与えることを意味します。お勧めします。変数を初期化するまで、どの bit がそのメモリ位置にある前に発生した構成される "と" の値があります。これは特に、他の言語から使用すると、ハンドルの初期化場合は注意して C++ の重要な側面です。非 POD のクラス型の変数を宣言した場合、コンストラクターは初期化を実行します。
次の例では、それぞれの記述を含め、単純変数の申告を示します。変数の特定の後続の処理を許可または拒否するために、コンパイラの使用方法が情報を入力するか例に示します。
int result = 0; // Declare and initialize an integer.
double coefficient = 10.8; // Declare and initialize a floating
// point value.
auto name = "Lady G."; // Declare a variable and let compiler
// deduce the type.
auto address; // error. Compiler cannot deduce a type
// without an intializing value.
age = 12; // error. Variable declaration must
// specify a type or use auto!
result = "Kenny G."; // error. Can’t assign text to an int.
string result = "zero"; // error. Can’t redefine a variable with
// new type.
int maxValue; // Not recommended! maxValue contains
// garbage bits until it is initialized.
基本的な (組み込み) 型
一部の言語とは異なり、C++ で他のすべての型に派生した汎用基本データ型はありません。言語の Visual C++ の実装では、多くの 基本型 (組み込み型が含まれています。これは int、double、long、ASCII および UNICODE 文字の char と wchar_t の型と boolなどの数値型と、各含まれています。ほとんどの基本 (bool、double、wchar_t と関連の型を除く) すべてを持つ変数に格納できる値の範囲を変更する符号なしのバージョンを入力します。たとえば、intは 32 ビット符号付き整数を格納する -2,147,483,648 ~ 2,147,483,647 の値を表すことができます。unsigned int、または bit 32 として格納されている、0 ~ 4,294,967,295 の値を格納できます。各ケースの値の合計数が同じである; 範囲のみ異なります。
基本型は、どの操作を実際に実行できると、他の基本型に変換できる方法を制御する組み込みの規則を持つコンパイラで認識されます。組み込みの数値型とサイズ、および制限の一覧については、基本を入力します (C++)を参照してください。
次の図は、組み込み型の相対サイズを示します:
次の表は、最もよく使用される基本型の一覧です:
型 |
サイズ |
コメント |
---|---|---|
int |
4 バイト |
整数値の既定のオプション。 |
double |
8 バイト |
浮動小数点値の場合の既定のオプション。 |
bool |
1 バイト |
true または false になる値を表します。 |
char |
1 バイト |
は、UNICODE に変換する必要がない std::string オブジェクトや古い C スタイルの文字列で ASCII 文字に使用します。 |
wchar_t |
2 バイト |
UNICODE ファイル形式でエンコードされるワイド文字 "" の値を表します (Windows の UTF-16 は、他のオペレーティング システムは異なる場合があります)。これは、型 std::wstringの文字列で使用される文字型です。 |
unsigned char |
1 バイト |
C++ に byte の組み込み型がありません。バイト値を表すために unsigned char を使用します。 |
unsigned int |
4 バイト |
bit のフラグのオプションのは簡素化されます。 |
long long |
8 バイト |
非常に大きな整数値を表します。 |
void 型
void の型は、特殊な型です。; void型の変数を宣言できませんが、必要な型 void * (voidへのポインター) の変数を宣言できます (生の非型指定されたメモリを割り当てる場合)。ただし、void へのポインターはタイプ セーフではありません。一般に使用すると、最新 C++ で強くお勧めします。関数の宣言では、void の戻り値は、関数が値を返さないことを意味します; これは voidの共通、適切な使い方です。C 言語が、パラメーター リストの void、たとえば、fou(void)を宣言する、パラメーターを持つ関数を要求するが、この方法は最新 C++ で防ぐこと、fou()で宣言する必要があります。詳細については、「型変換とタイプ セーフ (Modern C++)」を参照してください。
定数の型の修飾子
組み込みまたはユーザー定義型は const キーワードで修飾される場合があります。また、メンバー関数は、const修飾された-オーバーロードされた const-な場合があります。const の値が初期化された後は変更できません。
const double PI = 3.1415;
PI = .75 //Error. Cannot modify const variable.
const の修飾子は関数で広く使用され、変数の申告正確性と "const" は C++ の重要な概念です。; 基本的に、値が誤って変更しないよう、コンパイル時に確実に const を使用することを意味します。詳細については、「定数 (C++)」を参照してください。
const の型は非 const バージョンとは異なります; たとえば、const int は intから分離の種類です。変数から const ness を 削除する必要がある場合は、これらのまれな状況で const_cast C++ の演算子を使用できます。詳細については、「型変換とタイプ セーフ (Modern C++)」を参照してください。
文字列型
厳密には、C++ 言語の組み込み "文字列" の型がありません; char と wchar_t ストアに単一の文字–文字列を最後の有効な文字を超える配列の要素 1 に終端の null 値は (たとえば ASCIIの ‘\0’) は、これらの型の配列を宣言する必要があります ( "C スタイル文字列" と呼ばれる追加)。C スタイルの文字列ははるかに多くのコードが、外部文字列の実用的な記述されたライブラリ関数を使用する必要がありました。ただし、最新で、が標準 C++ ライブラリの型 std::string (8 ビット charの型の文字列の場合) または std::wstring があります (wchar_tの 16 ビットのタイプの文字列の場合)。これらの、STL コンテナーは、ネイティブな文字列としての型について、準拠しない C++ ビルド環境に含まれている標準ライブラリの一部であるため、考えることができます。これらの型は、プログラムで使用できるようにするために #include <string> ディレクティブを使用します。MFC や ATL を使用している場合は、CString のクラスも使用できますが、C++ 標準の一部ではありません)。null で終わる文字配列の使用は最新 C++ で 15 スタイル (B は、以前に述べられて文字列) を強くお勧めします。最新 C++ プログラムで、さまざまな型を変換する方法を使用する文字列型 文字列とテキスト (Modern C++)を使い分ける方法に関する詳細については。
ユーザー定義型
class、struct、これが基本型のように構成要素がコードの残りの部分で使用される union、または enumを定義すると、が。また、メモリ内に既知のサイズがあり、の使用方法に関するできるか特定の規則は、コンパイル時のチェックと、ランタイムによってプログラムの有効期間に適用されます。基本的な組み込み型とユーザー定義型との主な相違点は次のとおりです。:
コンパイラにユーザー定義型の組み込みの知識はありません。これが "コンパイル プロセス中に最初に定義を検出すると型の" 説明します。
クラスのメンバーと (オーバーロードすることにより) 適切な演算子を、どの操作が、型で実行できると、他の型のいずれかにして、非メンバー関数定義できます。変換できるかを指定します。詳細については、「オーバーロード」を参照してください。
これらは、静的に型指定する必要はありません (オブジェクトの型が変化しない規則)。継承、ポリモーフィズムの機構を通じて、クラスのユーザー定義型として (宣言された変数は、クラスのオブジェクトのインスタンス) 参照されたコンパイル時ではなく実行時に別の型を持つ場合があります。詳細については、「派生クラス」を参照してください。
ポインター型
C 言語の旧バージョンに遡って、C++ では特別な宣言 * (アスタリスク) を使用して、ポインター型の変数を宣言できるようにします。ポインター型は実際のデータ値が格納されているメモリ位置でのアドレスを格納します。最新 C++ では、これらは、未加工のポインターと呼ばれ、特別な演算子不等号) を使用して * (アスタリスク) またはダッシュ (->、コード内でアクセス。これは、スカラー型へのポインターまたはオブジェクトのメンバーへのポインターを逆参照しているとして使用できるようによってかによって変わりますが、逆参照すると呼び出されます。ポインター型の使用は、C および C++ での最も困難で、最も複雑な側面の 1 つが、プログラム開発です。ここでは、必要に応じてが、最新 C++ には (要求したり) スマート ポインター の進化に推奨されませんし、生のポインターの使用に役立つあるファクトと手法について説明します (このセクションの最後について説明します) は、オブジェクトの所有権に生のポインターをまったく使用することはできます。オブジェクトを観察するには生のポインターを使用することも有用ですが、セキュリティ オブジェクトの所有権にも使用する必要がある場合、によって所有されるオブジェクトの作成および破棄するか、意図的にと非常に十分に考慮が必要です。
、知る必要がある最初に、生のポインター変数を割り当てます逆参照されていると、ポインターが示すメモリ位置のアドレスを格納するために必要なメモリしか宣言しています。データ値のメモリの割り当て自体は (または バッキング ストアと呼ばれる) まだ割り当てられていません。つまり、生のポインター変数を宣言すると、メモリ アドレスの変数実際のデータ変数ではなくを作成します。バッキング ストアへの有効なアドレスが確実前のポインター変数を逆参照するには、プログラムで未定義の動作 (通常は致命的なエラーが発生します。)次の例は、この種類のエラーです:
int* pNumber; // Declare a pointer-to-int variable.
*pNumber = 10; // error. Although this may compile, it is
// a serious error. We are dereferencing an
// uninitialized pointer variable with no
// allocated memory to point to.
例では、メモリによって再配置実際の整数データまたは有効なメモリ アドレスを格納するために割り当てられることなく、ポインター型を逆参照します。次のコードは、これらのエラーを修正します:
int number = 10; // Declare and initialize a local integer
// variable for data backing store.
int* pNumber = &number; // Declare and initialize a local integer
// pointer variable to a valid memory
// address to that backing store.
...
*pNumber = 41; // Dereference and store a new value in
// the memory pointed to by
// pNumber, the integer variable called
// “number”. Note “number” was changed, not
// “pNumber”.
pNumber が指すバッキング ストアを作成する修正後のコード例は、を使用してローカル スタックにメモリ。ここでは、基本型を簡単にするために使用します。実際には、ポインターのバッキング ストアが最も頻繁に new のキーワードの式を使用して ヒープ (または "" ) を格納します放して呼ばれるメモリの領域で動的割り当てられているユーザー定義型です (プログラムする C で古いスタイルの malloc() C のランタイム ライブラリ関数が使用されています)。代入、特にクラス定義に基づいている場合は "オブジェクト" するために、これらの "変数" は、通常、参照されます。new によって割り当てられたメモリは delete のステートメント (または、によって割り当てるために malloc() の関数を使用して C のランタイム関数 free()) 削除する必要があります。
ただし、メモリ リークというリソースのバグの原因となる複雑なコードの目的を動的に割り当てられた特に削除するのを忘れている方が簡単です。したがって、生のポインターの使用は最新 C++ で強くお勧めします。(コードがスマート ポインターのスコープの外に出た) デストラクターが呼び出されても自動的にメモリを解放する スマート ポインターの生のポインターをラップすることは、ほとんど常に適しています; スマート ポインターを使用して仮想、C++ プログラムのバグのクラス全体を除外します。次の例では、MyClass がパブリック メソッド DoSomeWork();を持つユーザー定義型であるとします。
void someFunction() {
unique_ptr<MyClass> pMc(new MyClass);
pMc->DoSomeWork();
}
// No memory leak. Out-of-scope automatically calls the destructor
// for the unique_ptr, freeing the resource.
スマート ポインターの詳細については、スマート ポインター (Modern C++)を参照してください。
ポインターの変換に関する詳細については、型変換とタイプ セーフ (Modern C++)を参照してください。
一般に、ポインターの詳細については、ポインターを参照してください。
Windows のデータ型
C、および C++ のプログラミングする従来の Win32 ではほとんどの関数は、Windows 特定の typedef とパラメーターと戻り値の型を指定するには、#define のマクロ (windef.hで定義されている) を使用します。 "Windows" これらのデータ型は、C/C++ の組み込み型に指定されるか、特別な名前 (エイリアス) です。これらの typedef とプリプロセッサの定義の一覧については、Windows Data Types"を参照してください。これらの typedef の一部は、HRESULT と LCID など、便利、説明的です。そのほかに、INT など、特別な意味がなく、基本的な C++ の型のエイリアスだけです。Windows の他のデータ型に C のプログラミングおよび 16 ビット プロセッサの日から今日保持されるため、ハードウェア、オペレーティング システム、または名前が意味を持ちません。また、Windows Runtime base data typesとして示されている Windows のランタイム ライブラリに関連付けられている特別なデータ型になります。最新 C++ では、一般的なガイドラインは値がどのように関する解釈する必要があるか Windows の型が、追加の意味を伝える C++ の基本型を使用することです。
詳細情報
C++ の型システムに関する詳細については、次のトピックを参照してください。
使用に関連する問題とともに 値型に ついて説明します。 |
|
共通の型変換を示します問題、その回避方法について説明します。 |