C++

構造体

C++

C++にも構造体があるが、クラスとの違いで代表的なのは、クラスのデフォルトのメンバアクセスがprivateなのに対し、構造体のデフォルトのメンバアクセスがpublicであること・・・。struct_test.hで、アクセス指定子を付けずにメンバを用意・・・。 (C++では…

ユニヴァーサル参照

C++

std::moveの仕様を見ると、move (utility) - cpprefjp C++日本語リファレンス"T&& t"という引数の型を見ると、右辺値参照っぽいのになぜ左辺値も引数に取れるのか不思議に思う・・・。 実は、テンプレート関数など、T&&での推論が発生する状況においては、右…

move(utility)

C++

代入は、実質的にはオブジェクトのコピーである・・・。 obj = func(); // funcは右辺値なので一時オブジェクトをobjにコピーすることになる. 例えば、上のような場合にobjやfunc()の戻り値がint型ならまだしも、これが大きなクラスオブジェクトのコピーとな…

右辺値参照

C++

C++11では、右辺に置かれる定数リテラルや文字列リテラル、オブジェクトのコンストラクタや関数などは、右辺値と呼ぶ・・・。 一方、左辺に置かれる変数やオブジェクト、ポインタなどは左辺値と呼ぶ・・・。そして、C++03以前では単に「参照」と呼ばれていた…

代入演算子のオーバーロード

C++

コピーコンストラクタの項で、「オブジェクトの代入は、コピーではあるがコピーコンストラクタの対象外で、この場合コピー代入演算子のオーバーロードが必要」ということを書いた・・・。 このオブジェクトの代入の場合も、アドレスのコピーをしないようにコ…

auto

C++

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

auto_ptr

C++

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

for_each

C++

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

plus

C++

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

関数オブジェクト

C++

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

stack

C++

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

queue

C++

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

map

C++

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

pair

C++

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

set

C++

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

deque

C++

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

list

C++

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

iterator

C++

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

vector

C++

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

bitset

C++

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

using宣言

C++

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

using指令

C++

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

名前空間

C++

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

mutable

C++

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

constメンバ関数

C++

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

explicit

C++

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

変換コンストラクタ

C++

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

ユーザ定義変換

C++

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

dynamic_cast

C++

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

const_cast

C++

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