C++なんもわからんメモ
C++日本語レファレンス
C++ Standards Committee Papers
Google C++ Style Guide
C++完全理解ガイド Rev1.4.01
Wandbox
猫でもわかるC++プログラミング
懐かしすぎて泣いちゃった
最古のメモかもしれない
1章 C++をはじめる前に
オブジェクト指向プログラミングの特徴として、
カプセル化、継承、多態性がある
カプセル化はデータとそれに対する操作をワンセットとし、他からの不用意な操作によってデータが破壊されないようにする仕組み
継承はプログラムの機能を引き継げること
多態性は1つの名前で状況に応じて振る舞いが変わる
CPUの仕組み
ALU,制御装置,レジスタ,クロック
プログラムができあがるまで
1、ソースファイルにコーディング
2、コンパイルしてオブジェクトファイル
3、オブジェクトファイルにリンカでライブラリを結合
2章 C++の基本
ライブラリは何らかの名前空間の中に存在する
//でコメント
エスケープシーケンス
3章 変数とデータ型
float, double ,long doubleがある
floatは3.4*E38まで
定数はconstをつけると良い、変更しようとするとコンパイルエラーになる
iomanipをインクルードして、マニピュレータを使えばself関数などよりも簡単に書式設定ができる
これでfixed、setprecison、scientificが使える
4章 式と演算子
sizeof()で式や型のバイトを調べられる
1バイト = 8ビット
char 1バイト
int 4バイト
float 4バイト
double 8バイト
(int)式 or int(式)でキャストができる
でプリプロセッサによってマクロが文字列に置き換わる
<<と>>は左とみぎにシフト
左にシフトすると2倍になる
条件演算子
op1 ? op2:op3
5章 制御文
if(条件)だけで{}が省略されると次の1行だけが実行される
switch(制御式)
{case : 文; default: 文;}
switch文の中でbreakを抜いたら次の文が普通に実行される
do{}
while()
doの中が実行され、whileの条件を満たしていたらもう一度実行される
break:switch、for、whileを抜ける
continue:ループ内の残りの処理を飛ばしてブロックの先頭に戻って処理を続ける
goto文:goto ラベル名と書くと、ラベル名のところに飛んでいく
これはアホ
6章 関数
mainの中で関数を使いたいならプロトタイプ宣言せい
return は関数をそこで中断して呼び出しもとに制御を戻す働きがある
普通関数の中の変数は関数の呼び出しが終わったらなくなってしまう
関数がreturnしても値を保持し続けるためにはstaticをつける
グローバル変数と同じ名前のローカル変数があったらローカル変数が優先される
forループのiはforループの中のみで有効
externをつけると別のファイルに定義されているグローバル変数を使えるようになる
C++では引数の個数やデータ型が異なれば、同じ名前の関数を使うことができる
7章 ポインタと参照
&iで変数iのアドレスを見ることができる
アドレスを格納するための変数がポインタである
ポインタは、 int *pi;と宣言する
ポインタが何を指しているかわかったら、それに代入できる
初期化されていないポインタの指している先は落とし穴かもしれない
値呼び出しと参照呼び出しについて
ポインタ変数が格納されているアドレスを指すポインタがポインタのポインタである
C++ではある変数に対してエイリアスを作ることができる
参照は宣言時に初期化されなければならない
int a;
int &alias = a;
ポインタや参照に関数を渡すと呼び出しもの変数を変更できる
呼び出し先の関数で変数の値が変更されては困るという時はconstという予約語を使って関数を定義する
8章 配列・文字列とポインタ
int a[] = {1,2,3,4};という初期化ができる
配列の名前は先頭要素のアドレスに変換される
int型だとすると、4バイト進めることでa1のアドレスになる p+1
文字は数値である
“ABC”は先頭文字’A’の置かれたアドレスに変換される
これはめちゃくちゃ重要!
const char *str;
str = “ABC”;
*(str+0)は’A’、*(str+1)は’B’
str1とstr2に同じ文字列をいれると、同じアドレスが格納されているのだろうか?
これはわからない
というのもこれはOSに依存するので
文字列はcharの配列で扱うことができる
コマンドライン引数
argcにはコマンドライン引数の個数、argvにはにはコマンドライン引数が入っている
for(auto s:args)
関数に整数配列を渡す時は、x[]や int *として、引数がint型へのポインタであることを示す
文字列配列のときはchar型へのポインタのポインタ
多次元配列は省略できるのは最初の添字のみ
メモリの動的確保
int *p;
不要になったメモリはdelete演算子で開放する
delete [] p;
9章 クラスの基本
class Person
{
private:
public:
}
publicがないとprivate扱い
オブジェクトのアドレスを格納するポインタを生成することもできる
Person *pYamada;
クラスの宣言の中には関数の宣言をして、関数の中みはクラスのそとに書くのが普通
こうするとプログラムサイズが小さくなる
クラス宣言の中に書いてもOK
普通に非公開部にしているだけだと外部から値を入力したり、値を表示したりできないので、公開部にメンバ変数をセットしている
これがカプセル化みたいな?
オブジェクトが生成された段階でデータメンバを初期化できる仕組みがあれば便利そうだが、これを行うのがコンストラクタという特殊なメンバ変数
クラス名と同じ名前を持つ
データメンバ名()、というように初期化リストで初期化するべき
コンストラクタも関数の1つなのでオーバーロードできる
オブジェクトがコピーされるときに自動的に呼び出されるコンストラクタがコピーコンストラクタである
オブジェクトのメンバの値が単純にコピーされては困るときにはコピーコンストラクタを明示的に定義すれば良い
オブジェクトが消滅するときデストラクタ
クラス名に~をつけた名前
メンバ関数が呼び出されると自動的に呼び出したオブジェクトへのポインtなが渡される
これをthisポインタという
クラスのメンバに記憶クラス指定子staticをつけると、そのメンバは個々のオブジェクトではなく、クラス全体に関連づけられる
インスタンスを生成しなくても呼び出せる、特定のクラス専用の関数だということがすぐわかるなどという利点がある
データメンバやメンバ関数を指すポインタを作成することもできる
ポインタに対してクラスの外部から参照する場合、データメンバやメンバ関数はpublicでなければならない
struct, union
10章 クラスの継承
protectedは外部からはアクセスできないが、継承先からはアクセスできるという意味になる
基本クラスのコンストラクが呼ばれてから派生クラスのオブジェクトができるときも基本クラスのコンストラクが呼ばれる
基本クラスと派生クラスに同じ名前、同じ引数のメンバ関数があったとき、派生クラスのオブジェクトからそのメンバ関数を呼ぶと派生クラスのメンバ関数が実行される
これを関数のオーバーライドという
オーバーライドされた基本クラスのメンバ関数を派生クラスから呼び出すために前節ではスコープ解決演算子を利用したが、基本クラスのポインタを使う方法もある
基本クラスのポインタが派生クラスのオブジェクトを指している場合、基本クラスのメンバ関数がよびだされる
このような場合でも派生クラスの関数が実行された方が直感的でわかりやすい
そこでvirtualという予約語が登場する
これを仮想関数という
純粋仮想関数を1つ以上メンバに持つクラスを抽象クラスという
クラスの非公開部には外部からアクセスできないが、外部からアクセスしたい時もある
そういうときはフレンド関数を使う
仮想関数をメンバに持つクラスのポインタをそのクラスから派生したクラスのポインタに変換することをダウンキャストという
逆に派生クラスのポインタを基本クラスのポインタに変換することをアップキャストという
11章 演算子のオーバーロード
C++では関数と同様に演算子もオーバーロードすることができる
具体的にはopratorという予約語を使う
人生めち
12章 ファイル入出力
13章 テンプレート
14章 標準テンプレートライブラリ
15章 例外処理
16章 C++11の新機能
「C++小技集」
「ラムダ式」
「Auto」