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

23
C++ ででででででででででで あああああ

Upload: toshihiko-ando

Post on 28-Jun-2015

829 views

Category:

Documents


1 download

TRANSCRIPT

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

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

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

自己紹介

• あんどちん(安藤敏彦)• 名古屋出身・松戸在住• フリープログラマ

o 今は PHPとか BASHスクリプトとか相手にしてる

• 好きなものo 美味しい食事o 美味しい酒

• 嫌いなものo 不味い食事o 不味い酒

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

C++、覚えてますか?

• …どんな言語でもそうだけどo ある機能を覚えたきっかけが

職場の人のソース 学校の先輩のソース Webに載っていたソース

そこに載っていたものをパターンとして覚えてしまいがち。

だから、言語の機能で持っているものや、規格で決まっていることも知らなかったり

# まぁ、 C++er …は規格書大好きだから別か

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

…ところで

懇親会の追加受け付けます

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

C++

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

型周り

• char/signed char/unsigned charo こいつらは皆別の型

• int[n]_to サイズ指定型o C99由来。 cstdintで定義o 自分でサイズ毎の型を定義する必要なし

INT32とか、 DWORDとか

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

typedefと cv修飾

• typedefや constの位置は任意

// 以下の宣言は全部同じtypedef const unsigned int cuint;

const typedef unsigned int cuint;

int const typedef unsigned cuint;

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

virtualいらない。 overrideでいい

• 基底クラスで virtual宣言されているメソッドは派生クラスで virtualと書かなくても仮想関数

struct Base { virtual void foo(); };

struct Derived {

void foo(); // 仮想関数};

// 今時の C++erならこう書いたほうがいいstruct Derived {

void foo() override; // 仮想関数};

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

const参照での浮動小数点型と整数型

• 浮動小数点型変数への参照を整数型で作れる?o constなら YES

const double d = 3.5;

// const int temp_d = d; // intのテンポラリが作られるconst int& i = d; // 3 (dのテンポラリを指す )

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

アクセス修飾子

• 名前が見えなくなるわけじゃないo アクセスを制限するだけ

class Outer {

struct Inner {

void foo() {}

};

Inner v_;

public:

Inner get()

};

Outer o;

o.get.foo(); // できるよ!

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

operator &

• …これもオーバーロードできるからstruct S {

string operator &() { return string("hoge"); }

};

S s;

S* p = addressof(s); // これ大事

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

operator voidの挙動

struct S {

operator void() {}

};

S s;

static_cast<void>(s); // 呼ばれない。 GCC4.7は呼んでた

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

uniformed initializerによる初期化

• C++11では {}で初期化出来るようになって便利。

vector<int> v1{0, 1, 2, 3 }; // 要素4つのベクタvector<string> v2{1}; // 要素1つのベクタ

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

初期化

• クラスオブジェクトの初期化は宣言順

struct S {

S() : c(3), b(2), a(1) {} // a,b,cの順で初期化 int a;

int b;

int c;

};

Page 15: 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;

}

};

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

スコープ

• こんなのが 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; }};

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

Cとの違い

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

int main()

• Cでは returnいるけど、 C++ではいらないよo C++で returnの省略は return 0;になる

• C++ではmainの再帰やアドレス取得はダメo Cではいいらしい

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

式中の型宣言

• C++では式中の型宣言ができない// Cならこんなことができるstruct S1 { int a; } foo(struct S2{ int b; }*);

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

条件式の結果、代入式、カンマ演算子

• これらの結果は左辺値、 Cだと右辺値char arr[100];

sizeof(0,arr); // C++だと 100、 Cだと sizeof(char*)になる

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

戻り値の有無

• 戻り値型が宣言されている関数での returnなしo C++ではエラーo Cではエラーにならない

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

typedefと構造体(クラス)

• C++では同じスコープで別の typedefを作れない

typedef struct name1 {} name1; // どちらも OK

struct name2{};

typedef int name2; // Cだと OK

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

定数の扱い

• C++では未初期化の定数を作れない

const int v1 = 3; // どちらも OK

const int v2; // C++では NG