C++11 quick reference

C++の知識が古い人が、C++11になって追加された機能などについてメモしたもの。
コンパイラーにオプション -std=c++11 をつける必要がある。

g++ xxx.c -std=c++11

あれこれ

for

int v[]={1,2,3,4,5};
for (auto a:v) cout << a << endl;

あるいは、

for (auto a:{1,2,3,4,5}) cout << a << endl;

のような書き方が使える。また参照を使って

int v[]={1,2,3,4,5};
for (auto& a:v) ++a;

という書き方が可能。

nullptr

double* p = nullptr;

のように使う。0やNULLでなくてnullptrを使うことを推奨。整数との混同を避けられる。

int i = nullptr; // ERROR. nullptrはポインターであり、整数ではない。

enum class

列挙型である。しかしenumとちがって整数ではない。

constexpr

static_assert

定数式が満たされているか、コンパイル時に判断してエラーを出す。

static_assert(4<=sizeof(int),"integers are too small.");

unique_ptr

shared_ptr

move

std::move()は、引数の右辺値参照を返す標準ライブラリ関数である。rval()と名付けていいような函数である。

言葉

右辺値(Rvalues)、左辺値(Lvalues)

右辺値は、名前を持たない一時的なオブジェクト。左辺地は明示的に実体のある名前付きオブジェクト。

int i = 0;

といったとき、 i は名前付きのオブジェクトで左辺値。 0 というリテラル値は右辺値である。

右辺値参照と左辺値参照

& で宣言される参照型は左辺値参照と呼ぶ。&&で宣言される参照型は右辺値参照と呼ぶ。

class related

Move constructor

TEST

-----

リポジトリには、以下の情報が含まれる。情報はすべてプロジェクトのルートディレクトリにある、.git フォルダに格納される。

関係概念図

Main Repository (リモートマシン)
   ↑ push    ↓ fetch
Local Repository (ローカルマシン)
   ↑ git commit
Staging Area
(ローカルマシン)
   ↓
   ↓git checkout
   ↓

   ↑ git add
作業コピー (ローカルマシン)
merge
pull = fetch+merge
tag:
branch:

具体的な操作方法

初めて使うとき一回だけ行えばよい作業

git config --global user.name "Kazuya Aoki"
git config --global user.email "ka@example.com"

~/.gitconfig にあなたの情報がかかれる。これが登録されていないと、 お前はしらない、とおこられる。名前が示すとおりホームディレクトリにおかれる。 (globalが意味するところ。)

リポジトリに対する操作(必要最低限)

リポジトリの作成(一から自分で作る場合)

プロジェクトのルートディレクトリで、

>git init

とする。

リポジトリに変更を加える

>git add index.html
>git add contents.html
>git commit -m "add in hello world HTML"

とすれば、index.html, contents.html を staging area に持っていき、続いてコメントをつけてコミットすることができる。

add は初めてファイルをリポジトリに追加するときだけでなく、 いつでもその変更をコミットしたければ必要である。 リポジトリにあるファイルを変更しても、add してからcommitしないと、 変更されない。

>git commit -a

とすれば、add を省略して commit することができる。 (もちろんRepository に登録されているファイルの更新に限る)

show status

>git status
>git log -1

ブランチ関連操作

Branch

>git branch RB_1.0 master

master branchから、RB_1.0 (Release branch) を作る。
つくるだけで、現在のBranchからは移動せずそのまま。

>git checkout RB_1.0

とすると、新しいブランチに移動できる。

Rebase

>git rebase RB_1.0
RB_1.0ブランチから変更を取り出し、現在ブランチの先頭で変更を適用する。 これをRebaseと呼ぶ。

便利な機能

ファイルを無視する

コンパイル時にできた .o ファイルや、実行ファイルは リポジトリに登録したい人はいないだろう。このような無視したい ファイルがある場合は、

.gitignore

というファイルをつくり、そこにファイル名を記述する。ワイルドカードも使用可能。

.gitignore の内容の例

*.o
*~

GitGUI

>gitk

共用リポジトリ

共用のレポジトリの作成

Depotという名の場所に共用のリポジトリを設定する習慣である。 仮に/tmp/Depotという場所に作るとする。 git init を使って~/public_html ローカルに作ったリポジトリから、/tmp/Depotへ 共用のリポジトリをつくるには、

>cd /tmp/Depot
>git clone --bare ~/puiblic_html public_html.git

とする。共用のリポジトリには".git" をつけるのが習わしである。 --bareは、ベアリポジトリをさし、ここでは決して開発作業は行わない ということを意味する。(まさに共用リポジトリにふさわしい。) この作った共用リポジトリーを親とし、今まで使っていたリポジトリをその子供に設定するには、

git remote add origin /tmp/Depot/public_html

(.git)はつけなくてよい。

git remote update
git pull

共有リポジトリからクローンを作成

>cd my_proj
>git clone /tmp/Depot/public_html