C++ でぼくが忘れがちな
こと
あんどちん
自己紹介
• あんどちん(安藤敏彦)
• 名古屋出身・松戸在住
• フリープログラマ
o 今は PHP とか BASH スクリプトとか相手にしてる
• 好きなもの
o 美味しい食事
o 美味しい酒
• 嫌いなもの
o 不味い食事
o 不味い酒
C++ 、覚えてますか?
• …どんな言語でもそうだけど
o ある機能を覚えたきっかけが
 職場の人のソース
 学校の先輩のソース
 Web に載っていたソース
そこに載っていたものをパターンとして覚えて
しまいがち。
だから、言語の機能で持っているものや、規格
で決まっていることも知らなかったり
# まぁ、 C++er …は規格書大好きだから別か
…ところで
懇親会の追加受け付けます
C++
型周り
• char/signed char/unsigned char
o こいつらは皆別の型
• int[n]_t
o サイズ指定型
o C99 由来。 cstdint で定義
o 自分でサイズ毎の型を定義する必要なし
 INT32 とか、 DWORD とか
typedef と cv 修飾
• typedef や const の位置は任意
// 以下の宣言は全部同じ
typedef const unsigned int cuint;
const typedef unsigned int cuint;
int const typedef unsigned cuint;
virtual いらない。 override でいい
• 基底クラスで virtual 宣言されているメソッ
ドは派生クラスで virtual と書かなくても仮
想関数
struct Base { virtual void foo();   };
struct Derived {
void foo(); // 仮想関数
};
// 今時の C++er ならこう書いたほうがいい
struct Derived {
void foo() override; // 仮想関数
};
const 参照での浮動小数点型と整数
型
• 浮動小数点型変数への参照を整数型で作れ
る?
o const なら YES
const double d = 3.5;
// const int temp_d = d; // int のテンポラリが作られる
const int& i = d; // 3 (d のテンポラリを指す )
アクセス修飾子
• 名前が見えなくなるわけじゃない
o アクセスを制限するだけ
class Outer {
struct Inner {
void foo() {}
};
Inner v_;
public:
Inner get()
};
Outer o;
o.get.foo(); // できるよ!
operator &
• …これもオーバーロードできるから
struct S {
string operator &() { return string("hoge"); }
};
S s;
S* p = addressof(s); // これ大事
operator void の挙動
struct S {
operator void() {}
};
S s;
static_cast<void>(s); // 呼ばれない。 GCC4.7 は呼んでた
uniformed initializer による初期化
• C++11 では {} で初期化出来るようになって
便利。
vector<int> v1{0, 1, 2, 3 }; // 要素4つのベクタ
vector<string> v2{1}; // 要素1つのベクタ
初期化
• クラスオブジェクトの初期化は宣言順
struct S {
S() : c(3), b(2), a(1) {} // a,b,c の順で初期化
int a;
int b;
int c;
};
メンバ初期化での *this
• メンバ初期化の構文で *this を使える場合が
ある
struct outer {
unsigned int sz = sizeof(*this);
void f() {
int b[sizeof(*this)];
struct inner {
unsigned int sz = sizeof(*this); // OK
int c[sizeof(*this)]; // NG
} i;
}
};
スコープ
• こんなのが OK
typedef int T;
template<typename T = T, T init = T()> struct my_type {
T value = init;
my_type() = default;
my_type(const T& v) : value(v) {}
operator T() { return value; }
};
C との違い
int main()
• C では return いるけど、 C++ ではいらない
よ
o C++ で return の省略は return 0; になる
• C++ では main の再帰やアドレス取得はダメ
o C ではいいらしい
式中の型宣言
• C++ では式中の型宣言ができない
// C ならこんなことができる
struct S1 { int a; } foo(struct S2{ int b; }*);
条件式の結果、代入式、カンマ演
算子
• これらの結果は左辺値、 C だと右辺値
char arr[100];
sizeof(0,arr); // C++ だと 100 、 C だと sizeof(char*) になる
戻り値の有無
• 戻り値型が宣言されている関数での return
なし
o C++ ではエラー
o C ではエラーにならない
typedef と構造体(クラス)
• C++ では同じスコープで別の typedef を作れ
ない
typedef struct name1 {} name1; // どちらも OK
struct name2{};
typedef int name2; // C だと OK
定数の扱い
• C++ では未初期化の定数を作れない
const int v1 = 3; // どちらも OK
const int v2; // C++ では NG

C++でぼくが忘れがちなこと