c++でぼくが忘れがちなこと
TRANSCRIPT
C++でぼくが忘れがちなことあんどちん
自己紹介
• あんどちん(安藤敏彦)• 名古屋出身・松戸在住• フリープログラマ
o 今は PHPとか BASHスクリプトとか相手にしてる
• 好きなものo 美味しい食事o 美味しい酒
• 嫌いなものo 不味い食事o 不味い酒
C++、覚えてますか?
• …どんな言語でもそうだけどo ある機能を覚えたきっかけが
職場の人のソース 学校の先輩のソース Webに載っていたソース
そこに載っていたものをパターンとして覚えてしまいがち。
だから、言語の機能で持っているものや、規格で決まっていることも知らなかったり
# まぁ、 C++er …は規格書大好きだから別か
…ところで
懇親会の追加受け付けます
C++
型周り
• char/signed char/unsigned charo こいつらは皆別の型
• int[n]_to サイズ指定型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