読者です 読者をやめる 読者になる 読者になる

auto

C++11では、型名の代わりにautoを使うことで、初期化時に初期値を基準に型推論して型を決定することができる・・・。で、そのautoの前に、test.hにclass_testを定義・・・。x_というメンバを持ち、値をセットしたり、取得したり、出力したりするだけ・・・。…

auto_ptr

C++には、ガベージコレクションがないので、newで確保したメモリはdeleteで解放しなければならない・・・。 しかし、大きなプログラムになるとdeleteし忘れることもあるだろう・・・。そのような場合に備えて、C++ではスマートポインタなるものがある・・・…

for_each

for_eachは、C++標準ライブラリのSTLアルゴリズムのひとつで、指定されたコレクション(配列やベクタ、リストなど)の各要素ごとに指定された関数オブジェクトを実行するテンプレート関数・・・。for_each - C++ ReferenceSTLにおけるアルゴリズムは、本来のア…

plus

plusは、C++標準ライブラリの標準関数オブジェクトのひとつで、加算を行う関数オブジェクト・・・。plus - C++ Referenceベクターvec1とベクターvec2の要素を足して、その値をベクターvec3に追加、というのを繰り返してみる・・・。C++の標準関数オブジェク…

関数オブジェクト

関数オブジェクトは、括弧付で呼び出すことで、関数の様に振る舞うことができるオブジェクト・・・。 といっても、コンストラクタも括弧付で呼び出す場合があるので、何が違うのかとおもうだろう・・・。 コンストラクタは生成時の最初の1回だが、関数オブジ…

stack

stackは、C++標準ライブラリのSTL(標準テンプレートライブラリ)のひとつで、dequeを特殊化してLIFO(Last In First Out)なスタックとして使うようにしたもの・・・。stack - C++ Referencestackは、追加は先頭からしかできない・・・。取出しも先頭からしかで…

queue

queueは、C++標準ライブラリのSTL(標準テンプレートライブラリ)のひとつで、dequeを特殊化してFIFO(First In First Out)なキュー(待ち行列)として使うようにしたもの・・・。queue - C++ Referenceコンテナを内包し、操作を制限することで、特殊なコンテナと…

map

mapは、C++標準ライブラリのSTL(標準テンプレートライブラリ)のひとつで、マップ(連想配列)クラス・・・。map - C++ Referenceテンプレート引数にキーの型と値の型を指定して、オブジェクトを作成・・・。 オブジェクトにpair形式で要素を挿入していく・・・…

pair

pairは、C++標準ライブラリのユーティリティクラスで、2つの値を1つの組(ペア)として扱うクラス・・・。pair - C++ Referenceテンプレート引数で、2つの型を指定する・・・。 後述するmapなどに要素を挿入するときに使うことがほとんど・・・。utilityをイン…

set

setは、C++標準ライブラリのSTL(標準テンプレートライブラリ)のひとつで、集合クラス・・・。set - C++ Reference順序付き(ソート済)の集合で、値を要素として挿入すると、既定のソート規則にしたがってソートされる・・・。 参照する場合は、何番目などの指…

deque

dequeは、C++標準ライブラリのSTL(標準テンプレートライブラリ)のひとつで、両端キューテンプレートクラス・・・。deque - C++ Reference前後への要素の追加ができる待ち行列で、listのように先頭・末尾から追加や削除ができ、vectorのように添字演算子で要…

list

listは、C++標準ライブラリのSTL(標準テンプレートライブラリ)のひとつで、双方向リストテンプレートクラス・・・。list - C++ Referencelistをインクルード・・・。std::listでint型list・・・。 std::list::iteratorでint型list用のイテレータ・・・。双方…

iterator

vectorなどの複数の要素を持つクラスをコンテナと呼び、このコンテナの要素を繰り返し取り出すための概念としてイテレータ(反復子)というのがある・・・。iterator - C++ Referenceイテレータを使って要素を参照(取得)してみる・・・。iteratorはvectorでイ…

vector

vectorは、C++標準ライブラリのSTL(標準テンプレートライブラリ)のひとつで、動的配列テンプレートクラス・・・。vector - C++ Referencevectorをインクルード・・・。テンプレート引数には要素の型を指定・・・。要素がint型のベクタvecを作成・・・。push_…

bitset

bitsetは、C++標準ライブラリのビット集合クラス・・・。bitset - C++ Referenceこれを使うと、より簡単にビット列の表現や操作ができる・・・。bitsetをインクルードする必要がある・・・。テンプレート引数には要素数を指定する・・・。8ビットのビット列…

using宣言

using指令で名前空間を可視化することができたが、複数の名前空間を可視化すると、結局は他の名前空間のものと重複してしまう本末転倒なことが起きる・・・。 using指令では、ブロック内でその名前空間を持つすべての変数、関数、クラスから名前空間を省略で…

using指令

namespaceを使って、同じクラス名や同じ関数名や同じ変数名でも、別のものとして分けて認識できるようになった・・・。 しかし、そういったクラスや関数、変数がいくつも出てきた場合、いちいち名前空間を付けるのが面倒な場合がある・・・。 そういうときは…

名前空間

プログラムを複数のソースファイルに分けていると、名前が重複してしまうことがなくもない・・・。 普通は、変数、関数、クラスはブロックごとに分かれているのでそういうことはほとんどない気もするが、他人のソースコードと組み合わせたときに、グローバル…

mutable

constメンバ関数を使えば、そのメンバ関数は読み取り専用となり、メンバ変数を保護できる・・・。 しかし、これだと全てのメンバ変数の変更を禁止することになる・・・。 特定のメンバ変数だけは変更できるようにしたい・・・。 そういう場合は、そのメンバ…

constメンバ関数

メンバ関数の後ろにconstを付けると、そのメンバ関数からメンバ変数を変更できなくなる・・・。 読み取り専用メンバ関数とすることで、より安全性を高めている・・・。このようにメンバ関数get_iの後ろにconstを付けると、get_iからはメンバ変数i_を変更でき…

explicit

変換コンストラクタのように、暗黙的にコンストラクタが呼ばれる場合が結構あるが、そうしてほしくない場合もあったりする・・・。 explicitを付けることで、暗黙的なコンストラクタ呼び出しを禁止することができる・・・。まず、基本となるclass_test1を定…

変換コンストラクタ

引数が1つのコンストラクタは、'='を使った初期化のようにその引数を渡してオブジェクトを作成できる・・・。 引数をそのオブジェクトに変換される過程をコンストラクタに定義するので、型変換コンストラクタとか、変換コンストラクタという・・・。 (ユーザ…

ユーザ定義変換

自分が定義したクラスのオブジェクトを他の型に変換する時に、その変換過程をみずから定義することができる・・・。 つまり、指定された型に変換するキャスト演算子のオーバーロードといったところ・・・。 こういうのをユーザ定義変換とかユーザ定義型変換…

dynamic_cast

オーバーライド(仮想関数)の項で、派生オブジェクトポインタを基底オブジェクトポインタに格納して、基底クラスメソッドを呼び出すと派生クラスメソッド側が呼ばれるというのはすでに扱った・・・。このように派生オブジェクトを基底オブジェクトにキャスト…

const_cast

const_castは、ポインタや参照のconst属性を削除するキャスト演算子・・・。 (通常の変数のconstは削除できないので注意!)char型配列strを"ABCDE"で初期化・・・。 constなptr1にstrのアドレスを渡す・・・。 int型のiは10に初期化・・・。 constな参照jにi…

reinterpret_cast

reinterpret_castは、参照先の型が異なるポインタ間、またはポインタと変数の間でのキャスト、などに使われるC++のキャスト演算子のひとつ・・・。char *とunsigned int *間でキャストしてみる・・・。 また、char *とunsigned int間でも試してみる・・・。…

static_cast

C++には、目的に合わせた4種類のキャスト演算子がある・・・。 今回はstatic_castについて扱う・・・。static_castは、指定された型に変換する静的なキャストで、intや、floatなど、暗黙の型変換が可能な変数間のキャストで使われる・・・。 暗黙の型変換が…

typeid

typeid演算子は実行時の型情報を取得する演算子・・・。 型情報はtype_info型で返ってくる・・・。type_info - cpprefjp C++日本語リファレンスclass_baseオブジェクトのアドレスを、派生クラスのポインタclass_derived1、class_derived2に入れたら型情報は…

テンプレートクラス

型が違っても、同じ関数で取り扱うことができるテンプレート関数については、随分前にやった・・・。 テンプレートクラスはそのクラス版で、あらゆる型で同じように扱うことができるクラスである・・・。あらゆる型を要素にできるスタッククラスを作ってみる…

コピーコンストラクタ

コピーコンストラクタは、オブジェクトをコピーするときに呼ばれるコンストラクタ・・・。恒例のclass_profileを作成する・・・。profile.hは、 // クラスclass_profileの定義 class class_profile{ // 簡易名簿 // privateメンバ private: // このクラスか…

static

C言語では、static変数とかstatic関数とかを定義できた・・・。 C++では、クラスのメンバにstaticを付けて、staticメンバ変数やstaticメンバ関数を定義できる・・・。 このstaticメンバの意味は、オブジェクトではなくクラスそのもののメンバになるというこ…

private

privateアクセス指定子は、そのクラスのメンバのみアクセスを許可するもの・・・。そして、クラス継承時にprivateを付けたprivate継承をすると、publicメンバもprotectedメンバもその派生クラスのprivateメンバになる・・・。 (基底クラスのprivateメンバは…

protected

protectedアクセス指定子は、派生クラスからのメンバへのアクセスを許可するもの・・・。そして、クラス継承時にprotectedを付けたprotected継承をすると、publicメンバはprotectedになり、外部からのアクセスができなくなる・・・。protected.hでは、class_…

public

publicアクセス指定子は、クラス外部からのメンバへのアクセスを許可するもの・・・。base.hで、このように定義すれば、public_variable_もpublic_function()もクラス外部から利用できる・・・。一方で、privateアクセス指定子は、定義されたクラスのメンバ…

Hello, world!(C++)

次はC++版・・・。出力演算子" $ vi helloworld.cpp $ g++ helloworld.cpp -o helloworld $ ./helloworld Hello, world! $ こんな感じ・・・。Test/helloworld.cpp at master · bg1bgst333/Test · GitHub

extern "C"

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ポインタ

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 <クラス名>{ <アクセス指定子>: ~<クラ…

コンストラクタ

コンストラクタは、オブジェクトが作成されたときに呼ばれる初期化処理用のメンバ関数・・・。 これを定義しておくことで、メンバ変数などに初期値を設定するなど、オブジェクト作成時にしておかなければならない処理を行える・・・。コンストラクタは、戻り…

new演算子

C言語では、動的配列などのメモリを確保、解放するときは、malloc、freeというC標準ライブラリを使用していた・・・。 C++では、new演算子によってメモリの確保、delete演算子によってメモリの解放を行う・・・。ここでは、C言語のmallocの頁で作ったmalloc…