「」で保存した直後に、
コマンド端末で. /obufai
を実行すると、「ようこそ、Cプラスプラス言語へ。」と表示されます。つまり、上書き保存した内容は、まだオブジェクトファイルには、反映されていません。
こうなる理由は、ソースコードを書き換えて保存しても、それだけでは、オブジェクトファイルは、何も書き変わらないからです。
オブジェクトファイルを、内容「ようこそ、12345。」のものに書き換えるには、
g++ -o obufai
をもう一度、実行して、オブジェクトファイルを上書きする必要があります。
このあとに、コマンド端末で. /obufai
を実行すると、今度は「ようこそ、12345。」と表示されます。
まとめ [ 編集]
練習問題: 「hello, world」と表示させてみましょう [ 編集]
アメリカのプログラミングの入門書では、「hello, world」とメッセージ表示をするプログラムが、さいしょのほうに紹介されることが、多くあります。
ここwikibooksでも、さきほど習った知識をつかって、「hello, world」とメッセージ表示するプログラムを書いてみましょう。
答えのコードは、例えば、
cout << "hello, world" << endl;
のように、なります。
コードを書き替えたあとに、コマンド端末で、コマンド
などを実行して、コンパイルしなおしましょう。そしてコマンド端末で、コマンド.
Javaにおけるジェネリクスは、Java 1. 5から追加された。C++のテンプレートに「似た」概念で、ジェネリックプログラミングをサポートする。
概要 [ 編集]
例えば、以下のクラスを考える:
class Box {
Object element;
Box ( Object element) {
this. element = element;}}
そして以下のコードを考える。
class Main {
public static void main ( String [] args) {
Box boxOfString = new Box ( "hoge");
Box boxOfInteger = new Box ( Integer. valueOf ( 42));
unwrapBox ( boxOfString);
unwrapBox ( boxOfInteger); //!!! ClassCastException}
/**
* Stringが格納されているBoxのelementを取り出し、標準出力に表示する。
* @param box Boxのインスタンス
*/
public static void unwrapBox ( Box box) {
System. out. println (( String) box. element);}}
このとき、6行目の呼び出しは unwrapBox の呼び出し契約に違反している。なおかつ、 Integer は String と継承関係がないため、無条件に ClassCastException という例外が送出される [注 1] 。さらに、 boxOfString と boxOfInteger が相互代入可能なことで、将来コード量が増えた時―あるいはコピーアンドペーストでコードを書いたときに取り違えるリスクがある。ここで、ジェネリクスを使用して Box の定義、及び Main のコードを一部修正する:
class Box < T > {
T element;
Box ( T element) {
Box < String > boxOfString = new Box ( "hoge");
Box < Integer > boxOfInteger = new Box ( Integer. valueOf ( 42));
// unwrapBox(boxOfInteger); // コンパイルエラー}
public static void unwrapBox ( Box < String > box) {
System.
/
と入力して実行することで、「」を実行できます。「. /」を冒頭につけるのを、忘れないようにしてください。「. /」とは、現在のフォルダ位置を意味します。通常、OSを起動した直後の状態では、現在のフォルダはホームフォルダに設定されている場合が多いと思いますので、ホームフォルダを探してください。きっと、「」という名前のファイルがホームフォルダ内に追加されているはずです。
「. /」というコマンドの意味は、「現在のフォルダにあるファイル『』を実行しろ」という意味です。
この「」に、さきほどコンパイルした「」がアセンブリ言語にコンパイルされた状態で置かれているので、よってコマンド「. /」の実行により、コード「」の内容が実行されます。
「. /」の実行により、コマンド端末に「ようこそ、Cプラスプラス言語へ。」と表示されれば、成功です。「ようこそ、Cプラスプラス言語へ。」と表示されていれば、正常にコンパイルされた実行ファイルを、正常に実行できた事になります。
では、ここではこのソースコード「」の内容について簡単に説明します。
(C++言語のコード「」の再掲)
1行目の「 #include 」は、新しいスタイルのヘッダです。 C言語では「#include 」のようにファイル名を指定しましたが、これは古いスタイルのヘッダで、C++では新しいスタイルのヘッダを使い、標準識別子を指定します。新しいスタイルのヘッダは、ファイル名ではないので「. h」拡張子がありません。古いスタイルのヘッダは、まだ使用できますが、推奨されません。標準Cヘッダを新しいスタイルで書くと、接頭辞にcが付きます。例えば、「#include
println ( "aaa");
throw new GenericThrowable < String > ();} catch ( GenericThrowable < Integer > gti) {
throw gti;} catch ( GenericThrowable < String > gts) {
System. println ( "GenericThrowable");}}}
このコードはコンパイルできない。イレイジャにより型変数が「消える」のでコンパイラはどちらのcatch節へ行くべきか決定不能でもある。
注釈 [ 編集]
^ この例外はキャストが成功しなかったことを示す。 A 型とされる式 a から B 型へのキャストが成功しなかったということは、 a は B 型ではないということを意味する。
^ 本来であればaddAllメソッドを使うべきだが、ここではトピックを説明するためになかったものとする
^ 任意の動物が入るダンボール箱に犬を入れても、何も論理的破綻はないのを想像すると、自ずと理に適っていることが了解されるだろう
出典 [ 編集]
^ Java言語仕様第3版§4. 8
^ 20210414
関連項目 [ 編集]
C++/テンプレート
クラス名 という書式になっています。ピリオド(. )のあとにクラス名をつけて、セレクタを記述します。
これは、ある クラス が指定された要素にだけスタイルを適用します。HTML側ではクラスはなんらかのタグ内で class="クラス名" のように、 class 属性として与えます。なお、指定したい部分にぴったりな要素がない場合は、 div や span 要素で囲んで、それらに class 属性を付けてください。
また、同じクラスの要素は文書中にいくつあってもかまいません。特定の要素に付いたクラスにだけ適用させる場合には、 要素名. クラス名 とすれば、両方一致するものにだけ適用されます。