C++
型が違っても、同じ関数で取り扱うことができるテンプレート関数については、随分前にやった・・・。 テンプレートクラスはそのクラス版で、あらゆる型で同じように扱うことができるクラスである・・・。あらゆる型を要素にできるスタッククラスを作ってみる…
コピーコンストラクタは、オブジェクトをコピーするときに呼ばれるコンストラクタ・・・。恒例のclass_profileを作成する・・・。profile.hは、 // クラスclass_profileの定義 class class_profile{ // 簡易名簿 // privateメンバ private: // このクラスか…
C言語では、static変数とかstatic関数とかを定義できた・・・。 C++では、クラスのメンバにstaticを付けて、staticメンバ変数やstaticメンバ関数を定義できる・・・。 このstaticメンバの意味は、オブジェクトではなくクラスそのもののメンバになるというこ…
privateアクセス指定子は、そのクラスのメンバのみアクセスを許可するもの・・・。そして、クラス継承時にprivateを付けたprivate継承をすると、publicメンバもprotectedメンバもその派生クラスのprivateメンバになる・・・。 (基底クラスのprivateメンバは…
protectedアクセス指定子は、派生クラスからのメンバへのアクセスを許可するもの・・・。そして、クラス継承時にprotectedを付けたprotected継承をすると、publicメンバはprotectedになり、外部からのアクセスができなくなる・・・。protected.hでは、class_…
publicアクセス指定子は、クラス外部からのメンバへのアクセスを許可するもの・・・。base.hで、このように定義すれば、public_variable_もpublic_function()もクラス外部から利用できる・・・。一方で、privateアクセス指定子は、定義されたクラスのメンバ…
C言語とC++が混在するプロジェクトでは、よく「extern "C"」という記述が見られる・・・。これは、C言語のソースからC++の関数、またはその逆を行う時に起こるマングリングという問題を回避するための記述である・・・。 (詳細は、 マングリング - debian36…
これまでC言語などでは、setjmpやlongjmp関数、関数の戻り値などをみて、異常な値の場合はエラー処理をしていた・・・。 C++などのオブジェクト指向言語の多くは、より高度なエラー処理をするために例外処理機構をもっている・・・。入力された値xが0以下だ…
関数オーバーロードの頁で、引数の型が違う同名の関数を定義でき、引数型によって呼ぶ関数を変化させることができた・・・。しかし仮に、内部の処理が引数型以外に変わらなかったら、複数定義するのは無駄である・・・。内部が同じでありながら引数型が違う…
前回のオーバーライドで、基底クラスのメンバ関数と派生クラスのメンバ関数が同じ名前の場合は、格納されているポインタの型によって、呼ばれる関数が違った・・・。 基底クラスのポインタなら基底クラスのメンバ関数、派生クラスのポインタなら派生クラスの…
前回の継承では、基底クラスclass_profileのoutputと派生クラスlass_detailのoutput_detailは名前の通り敢えて別々にしていた・・・。同じだとどうなるのだろうか・・・?基底クラスと同じ名前(同じ引数の数、引数型)のメンバ関数を派生クラスに定義すると、…
既存のクラスをベースに、新しいメンバを追加して、新たなクラスを作ることをクラスの継承という・・・。 これまで何度も出てきたclass_profileを基底クラス(ベース)にして、さらに4つの項目を追加したclass_detailを作る・・・。あらためて、class_profile…
関数が引数の数や型の違いで挙動を変えることができるように、演算子も対象となる変数の型やオブジェクトの違いによって挙動を変えることができる・・・。これを演算子のオーバーロードという・・・。対象となるクラスや演算子によって書き方はいろいろ違う…
thisポインタは、メンバ関数の中で、そのメンバ関数の参照元のオブジェクト自身を指すポインタ・・・。 p->func(); // funcの参照元のオブジェクトはp. 上記の例で言えば、func()の中でのthisとはpのことを指している・・・。クラス外の関数(フレンド関数や…
の説明の前にちょっとだけ・・・。これまで何度か出てきた簡易名簿クラスclass_profileを、std::stringなどを使って書き直してみる・・・。これまで、input/outputメンバ関数を作って、一気に入力や出力をしていたが、 それだと、入出力する要素が増えたとき…
C言語では、引数をポインタにすることで、変数のアドレスをもらい、関数内部からそのアドレスの変数にアクセスして、値を書き換えることができた。 ただ、アクセスするときはポインタ演算子'*'が必要だった・・・。 void func(int *a){ *a = 10; /* 呼び出し…
C++では、引数の数や、引数型の違いによって、同じ関数名を持つ動作の違う別の関数を定義できる・・・。 これを、関数のオーバーロードという・・・。前回のclass_string_bufferでcreateという文字列バッファ生成関数があったが、生成だけじゃなく特定の文字…
C++では、引数にデフォルトの値を設定できる・・・。 デフォルト引数が設定された関数は、引数を渡さずに呼ぶことができ、その時は内部がデフォルト値で処理される・・・。 void func(int i); void func2(int j = 20); void func(int i = 10){ printf("i = %…
コンストラクタが、オブジェクト生成時に初期化処理をするメンバ関数ならば、 デストラクタは、オブジェクト破棄時に終了処理をするメンバ関数・・・。デストラクタは、戻り値なしで、頭にチルダ('~')をつけて、 class <クラス名>{ <アクセス指定子>: ~<クラ…
コンストラクタは、オブジェクトが作成されたときに呼ばれる初期化処理用のメンバ関数・・・。 これを定義しておくことで、メンバ変数などに初期値を設定するなど、オブジェクト作成時にしておかなければならない処理を行える・・・。コンストラクタは、戻り…
C言語では、動的配列などのメモリを確保、解放するときは、malloc、freeというC標準ライブラリを使用していた・・・。 C++では、new演算子によってメモリの確保、delete演算子によってメモリの解放を行う・・・。ここでは、C言語のmallocの頁で作ったmalloc…
stringは、C++標準ライブラリの文字列クラス・・・。string - C++ Referencestringクラスのオブジェクトに文字列を格納すると、より簡単に直感的に文字列操作ができる・・・。stringクラスを使うには、stringヘッダをインクルードする必要がある・・・。オブ…
ofstreamは、C++標準ライブラリのファイル出力用ストリームクラス・・・。ofstream - C++ Referenceここでは、標準入力で入力された名前(name)、年齢(age)、住所(address)をファイル"test.txt"に出力する・・・。変数、配列、オブジェクトの宣言・・・。ファ…
ifstreamは、C++標準ライブラリのファイル入力用ストリームクラス・・・。ifstream - C++ Referenceここでは、名前(name)、年齢(age)、住所(address)の書かれた"test.txt"をifstreamで読み込んで、各変数・配列に格納する・・・。まず、ifstreamなどのファイ…
クラスは、オブジェクト指向言語の中心的な機能・・・。 オブジェクト指向については別のサイトを参照の事として、C++では、以下のように定義する・・・。 class <クラス名>{ <アクセス指定子>: <メンバ変数の型> <メンバ変数名>; <メンバ関数のプロトタイプ…
C++では、出力演算子とともに入力演算子も用意されている・・・。出力演算子">"が入力演算子で、 std::cin >> <変数や文字配列やオブジェクト>; このように書くことで、入力データが変数などに格納される・・・。 std::cinは、予めC++で用意されている標準入…
C++でもprintfをはじめとするC標準ライブラリを使うことはできるが、単純な文字列の出力なら出力演算子を使うと楽である・・・。C++標準入出力を使うには、iostreamヘッダをインクルードする必要がある・・・。まず、リテラルの出力だが、整数でも、実数でも…
C++では、真偽値(trueまたはfalse)をもつbool型が新たに導入されている・・・。ここでは要素数5の配列に入れた値の中に、入力された値と同じものがあるかどうかを探すプログラムを作る・・・。 その中で、みつかったかどうかをbool型の変数で表し、trueのと…
C++はC言語のスーパーセットなので、C言語で書くこともできるが、せっかくC++なので、C++形式のmain関数について書く・・・。以前、C言語で"main_function"と表示していたのをC++で書いてみる・・・。 $ vi main_function.cppC言語では、標準入出力ヘッダはs…