キーワード (C++)は、プログラミング言語の1つであるC++のキーワード(予約語を参照)に関する説明。この項目は、プログラムの細かい説明には立ち入らず、他の言語と比較できるような説明を目的としている。C++11には86のキーワードがある。最初に制定された規格であるC++98では73のキーワードが採用され、C++11で新たに13のキーワードおよび2つの文脈依存のキーワード(後述)が追加された。C++11から追加のキーワード及び機能には(*)を付す。C++14ではキーワードは増えていない。C89で存在したキーワードは、すべてがほぼそのままの形で取り入れられている。中には、inlineなど最初C++98に導入されたキーワードが後からC99にも導入されたものもある。alignof は C11/C++11 両方に追加された。Nullポインタを表す。この値はあるcodice_1型のオブジェクトで、任意のポインタ型のNullポインタ値に暗黙変換できるが、codice_2とは異なり整数型には暗黙変換できない。codice_3は、codice_4としても用いられる。codice_5は少なくとも64ビットの精度を持つ整数型である(*)。C99ではマクロあるいはtypedefで作られておりキーワードではないが、C++ではキーワードである。wchar_tは、Cではキーワードでないが、C++ではキーワードである。codice_6とcodice_7は、それぞれUTF-16およびUTF-32の文字を格納するための整数型を表す。変数宣言の際に型として指定すると、初期化式から型推論を行う。また、戻り値型を後置きする関数宣言に用いる。C++においてstructはデフォルトのアクセス制御がpublicであること以外はclassと全く同じである。unionもクラスの一種という扱いである。unionはすべてのメンバ変数が同一メモリ領域を共有するのはCのままであるが、classに準じてメンバ関数を持てるようになっている。クラス内で宣言した変数・関数は、データメンバー・メンバ関数と呼ぶ。フィールド・メソッドなどといった言葉は用いない。codice_8単独ではスコープのない列挙型を意味する。codice_9、codice_10の形で、スコープ付きの列挙型の宣言に使用する(*)。Cの書き換え不能という意味に加え、定数の意味が加わっている。具体的にはCと違いブロックスコープにない場合、定数扱いとなり、externを指定しない限り内部結合になる。プリプロセッサによるマクロの代替的手段になる。このコード片で、CではNが定数ではないのでArrayはエラーになる。C99でもグローバル変数は可変長配列にできないのでやはりエラーになる。クラス内では、整数型にstatic constを修飾するとクラススコープの定数の定義になる。詳しくはstaticを参照のこと。volatileの指定された記憶領域は、実行しているコードが書き換えを行わない場合にも、何らかの理由で内容が書き換えられる可能性を持つ。書き換えの起きる具体的な要因としては、何らかのハードウェアによる書き換えが挙げられる。コンパイラによる最適化では、メモリを書き換えない限り内容が変わらないことを利用し、メモリからの再読み込みの省略などを行うが、例えばあるメモリ領域にハードウェアが書き込んでいて、そのメモリ領域の変化を読み取りループで監視しようとするならば、volatile指定が無い場合はコンパイラが「書き込みを行っていないのでメモリ内容が変化する可能性は無い」と判断し、ループを消し去ったり、メモリを再読み込みせずに単純な無限ループを行ったりするなど、期待と異なる最適化を行う可能性が高い。そのような場合、volatileを適切に指定することで、メモリ領域を正しくポーリングすることが期待できる。また、コンパイラによっては、volatileの指定された記憶領域へのアクセス前後において、適切なメモリバリアを自動的に配置することもある。が、逆にメモリバリアについては一切関知しないものもある為、ノンブロッキング同期プログラミングなどでは特別な注意が必要となる。ハードウェアに近い操作を行う処理を記述する際は、特に重要になる修飾子である。C++03以前では自動変数を意味する記憶クラス指定子であったが、C++11で廃止され、全く別の機能が割り当てられた。関数内で定義した変数はデフォルトで自動変数となるため、C++03以前においても記憶クラス指定子としてのcodice_11を用いる必要は全くない。前方互換性のためにも無意味に使用すべきではない。なお、記憶クラスを指定しない変数の記憶クラスのを表す用語としては「自動変数」(auto変数)のままで変更はない。Cからの外部結合の指定に加え、リンケージ指定の用法が加わっている。C++では名前(関数名や変数名など)に対して多重定義や名前空間、型安全の保障などの都合から、多くのコンパイラは名前修飾を施しCとは異なった名前をリンカに対して用いている。その名前の修飾の仕方を指定するのがリンケージ指定である。少なくとも"C"と"C++"の2種類のリンケージが使用できる。何も指定しないと"C++"になる。"C"リンケージでは名前の変形を抑止しCと互換の名前をリンカに対して用いることを意味する。これによりCとC++を混在させてプログラムを作るときに使われる。また、codice_12の形でテンプレート実体化宣言を修飾して、外部で実体化されたテンプレートを指定する(*)。特にレジスタに割り当ててほしい自動変数に指定するが、Cよりも意味合いが弱まっている。Cのregister変数はアドレス参照(codice_13演算子によるポインタ取得)を行えないが、C++では行える。つまり、register変数として宣言してもメモリに配置されうる。コンパイラが高度な最適化を行う場合、レジスタに配置すべき変数の判断はコンパイラの方が適切に行えることが多いので、現在のコンパイラはこの指定を無視するのが一般的である。C++11においてはdeprecated(推奨しない機能)とされ、将来の規格では削除される可能性がある。特にクラスの場合、これは宣言となるため普通のグローバル変数などと同様にソースファイルで定義が必要である。ただし次の場合、例外として不要である。古いC++処理系ではstatic const "整数型"による定数の定義ができないので、代わりに列挙(enum)で代用をすることがしばしばある。これはenumハックと呼ばれる。グローバル変数やクラス・関数内静的変数について、スレッドローカルな記憶域に確保するよう指示する。フレンド関数・フレンドクラスの宣言に用いる。定数式を表す。変数や関数を修飾して、コンパイル時定数となりうることを指示する。クラスメンバと継承のアクセス制御に用いられる。Javaなどとは違い個々の宣言に付けるものではなく、見た目には関数内でラベルを指定するのと似たような雰囲気である。1度指定すると他の指定がなされるか、クラスの宣言が終わるまでは指定した制御が続く。自分自身へのポインタ。当然ながらクラスの非静的メンバ関数内でのみ使用できる。参照でなくポインタである理由は、thisがC++に導入された当時まだ参照がなかったからであるdefaultは関数の定義にも用いる。特殊メンバ関数を「codice_17」の形で定義して、コンパイラ生成のものを使用することを明示する(*)。newはヒープにオブジェクトを割り当てるnewとnew[]演算子に用いられ、deleteはそれを開放する演算子 deleteとdelete[]に用いられる([]の有無で演算子は区別される)。JavaやC#などと違い、C++はガベージコレクションをもたないのでオブジェクトが不要になったら自分でdeleteを呼ぶ必要がある(スマートポインタを用いてdeleteの手間を省くようにすることはできる)。もっとも、C++には自動変数・大域変数などが存在するため、それほどnewは多用されない。deleteは関数の定義にも使用される。関数を「codice_18」の形で定義して、そのシグネチャの関数を存在させないことを指示する(*)。型変換(キャスト)は注意を要する操作であるにもかかわらず、Cの型変換演算子はあまりにも目立たず、目的がコードから見えにくいという理由からC++では、型変換を行う場合には用途ごとの4つの型変換演算子を用いることが推奨されている。動的キャスト。RTTIを用いて、目的の型に変換できるかどうかを確認し、不可能であればポインタの場合Nullポインタを返し、参照の場合はbad_cast例外を投げる。また、Cに無い概念の為、Cの型変換演算子で代用できない。静的キャスト。コンパイル時に型チェックを行う。変換前の型から変換後の型へ、あるいはその逆向きの暗黙の変換が存在する場合に変換可能である。変換できなければコンパイルエラーになる。const/volatile性を取り除く場合に用いるキャストである。他のキャストでconst/volatile性が失われる変換はできない。安全でなかったり移植性のない型変換に用いる。無関係なポインタ型同士の変換や、ポインタと整数型の変換などがそうである。型のアライメントの値を得る。 式から型を取得し、型名として用いる。 型、あるいは式の型のサイズを得る。また、codice_19の形で、可変長引数テンプレートの可変長引数部の長さを取得する(*)。例外を投げる。また、後述の例外指定の用法もある(C++11以降でこの用法は非推奨)。関数に例外指定を付与する。C++11以降は、throwを用いた例外指定は推奨されない。C++03以前でも、throwを用いた例外指定は例外安全のうち例外を投げない表明としてfunc5のように型を無指定にして用いられる場合が大半であった。また、noexceptは例外指定の有無を判定する式としても用いられる。コンパイル時に評価される表明を記述する。検査式が偽になると、指定されたメッセージを伴ってコンパイルエラーとなる。宣言として扱われるが、プログラムの動作には影響がない。用法2.はなぜ存在するのかというと、曖昧性が生じさせないためである。たとえばs1に次のようなクラスをテンプレート引数に渡すとする。すると、仮にtypenameがなければs1
出典:wikipedia
LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。