C言語を知っている人向けに、C++言語の文法を説明します。
C++言語の文法を全て説明はしません。これだけ分っていれば、簡単なオブジェクト指向プログラミングが出来るレベルの文法の説明をします。C++初歩編では、オブジェクト指向プログラミングを体感してもらうため、グラフィックウィンドウでゲームを作成することを通して、プログラミングを主体に進めていきましたが、本章は、コンソールウィンドウを使って文法を説明する程度のプログラムにしています。
プログラミングを勉強する時に最初に学ぶ「Hello World」のプログラムを、C言語とC++言語で書き、その違いを説明します。
整数を2つ入力して、その加減乗除の結果を表示するプログラムを作成します。小数点以下の桁数を指定して表示する方法が、C言語の時と違います。
また、整数同士の割り算の結果を小数点以下まで求めるのに、double型でキャストしますが、このキャストの書き方が、C++言語の場合、C言語のキャストよりも安全な書き方があるので、それを使います。
C++言語では、C言語形式のキャストを使うことができますが、何でも出来てしまうこのC言語形式のキャストは推奨されていません。
C++言語では、static_cast(静的キャスト)、reinterpret_cast(再解釈キャスト)、const_cast(const無効化キャスト)、dynamic_cast(動的キャスト)の4つのキャストを使い分けることが推奨されており、この使い分けについて説明します。
C++言語には、C言語には無かった参照型があります。
関数の引数に使うと便利で、呼び出し元の変数を参照/更新することができます。C言語の場合は、ポインタを使うしかありませんでした。ポインタを使ったプログラムと、参照を使ったプログラムを比較しながら説明します。
C++言語には、STL(Standard Template Library)という標準ライブラリがあり、様々なデータ構造を扱うことのできるコンテナが用意されています。
C言語の配列を使ったプログラムと、コンテナを使ったプログラムを比較しながら説明します。
C++言語は、もともとC言語をベースにオブジェクト指向プログラミングができる機能を追加した言語として進化していったものです。オブジェクト指向は、もの(オブジェクト)に注目してプログラムを作成していく考え方で、オブジェクトを定義するものとしてクラスがあります。
クラスを宣言し、クラスの実態であるインスタンスが生成、破棄される流れをプログラムを作成して、動かしながら説明します。
動画投稿を、暫くお休みしていました。復習を兼ねて、C言語の時にも作ったジャンケンゲームをC++言語で作ります。
ChatGPTにプログラムを作成してもらって、これを説明します。
C言語の文字列は、char型配列の中に文字を入れて、最後に塗る文字をセットすることで文字列にしていました。C++言語も、コンピュータの中では、C言語の同じ動きですが、std::stringという標準クラスが用意されていて、配列やポインタを意識しなくとも、直感的なプログラミングが出来るようになっています。
今回も、ChatGPTにサンプルプログラムを書いてもらって説明します。
C++言語は、C言語をより便利に使えるように機能追加が行われています。今回は、関数定義に関して追加された機能を紹介します。以下の4つが、よく使われる新しい機能です。
デフォルト引数
関数オーバーロード
関数テンプレート
ラムダ式
今回も、ChatGPTにサンプルプログラムを書いてもらって説明します。
名前空間は、C言語にはないC++言語で新たに追加された機能のです。名前空間が異なれば、同じ名前の変数や関数を作る事ができ、大規模なプログラムや共用ライブラリを作る時に、名前を重複を気にせずに、名前を作ることができるようになります。
今回も、ChatGPTにサンプルプログラムを書いてもらって説明します。
演算子のオーバーロードも、C言語にはないC++言語で新たに追加された機能のです。関数オーバーロードと同じ仕組みでoperatorというキーワードを使ってメソッド(関数)を定義することで、演算子を書くと、その演算子に対応したメソッド(関数)が呼び出されます。
今回も、ChatGPTにサンプルプログラムを書いてもらって説明します。
C++言語では、try/catch/throwの3つのキーワードを使った、メソッド(関数)に跨がった分岐を行うことができます。
エラーを補足し、エラー情報をthrow(投げる)し、chathを書いた所で、その情報を受け取り、エラーに対処するプログラムを書く、といった使い方をします。
ChatGPTに、例外処理のサンプルプログラムを作成してもらい、それを詳細に説明していきます。
今回も、ChatGPTにサンプルプログラムを書いてもらって説明します。
C++言語では、autoやdecltypeというキーワードを使って、コンパイラにデータ型を推定してもらう事ができます。
autoは、範囲for文やラムダ式と組み合わせて、よく使われます。
decltypeも、テンプレートと組み合わせて使う事で、高度なプログラミングをすることができます。
C++11では、ムーブセマンティクスという概念が取り入れられ、オブジェクトの所有権を効率的に移動させる事で、より高速なプログラムの作成が可能となりました。
ムーブセマンティクスを実現するため、C++11では、右辺値参照の機能が追加されました。最初に、右辺値と左辺値の違いを説明した後、右辺値参照型の宣言方法を説明します。
この右辺値参照型の宣言は、参照型やポインタ型の宣言と比較しながら説明していきます。
オブジェクトが大量のリソースを所持する関係をもっている場合、コンストラクタでリソースを獲得し、デストラクタで返却するようにします。これはRAII(Resource Acquisition Is Initialization)と呼ばれる考え方に基づいた、C++言語の開発であるビャーネ・ストロヴストルップが推奨した書き方です。
コンストラクタには、普通にオブジェクトを生成した時に動くコンストラクタの他、コピーコンストラクタとムーブコンストラクタがあります。これらのコンストラクタの定義方法を説明し、どのような時に、これらが動くのかを説明します。
大量のリソースを所持するオブジェクトは、コピーコンストラクタが動くとコンピュータへの負担が高くなるため、出来るだけムーブコンストラクタを使うようにします。vector配列に要素を追加するプログラムを例に、効率のよいプログラムにするための方法を説明します。
(その1) コンストラクタとデストラクタ
リソースを所持する関係を持つSampleクラスを作成します。リソースはコンストラクタでnewし、デストラクタでdeleteするようにします。また、メモリーリークを確認できるようなプログラムにします。
(その2)コピーコンストラクタ
コピーコンストラクタを作成します。コピーコンストラクタの引数はconstの付いた参照型です。
(その3) ムーブコンストラクタ
ムーブコンストラクタを作成します。ムーブコンストラクタの引数は右辺値参照型です。
(その4)ムーブとコピー(演算子のオーバーロード)
コピーとムーブの違いを説明します。また、代入演算子のオーバーロードを作成します。代入演算にはコピー代入とムーブ代入があります。
(その5) ムーブセマンティクスの活用例
Sampleクラスのオブジェクトが要素のvector配列を作成します。この回では、push_backで要素を追加していった時の、メモリーイメージを説明しています。また、push_backをemplace_backに変えた場合の動き違いについても説明します。最後に範囲for文でオブジェクトの中身を見るプログラムを書いた時、書き方によって無駄なコピーコンストラクタが発生してしまうことを説明します。
(その6)コンストラクタ達の動きを試す実験
前の回で説明したvector配列に要素を追加するプログラムを、実際に作成して動かします。コピーコンストラクタやムーブコンストラクタが定義されていないと、どのような動きになるかを実験します。