13,009
回編集
4行目: | 4行目: | ||
== C++11の変更点 == | == C++11の変更点 == | ||
C++11の拡張やライブラリを使用するためには、C++11に対応したコンパイラが必要になる。<br> | |||
また、コンパイラによっては、C++11の機能を使用するために、明示的にオプションで指定する必要がある。<br> | |||
<br> | |||
以下は、コンパイルオプションの例である。<br> | |||
g++49 -std=c++11 foo.cc | |||
g++48 -std=c++11 foo.cc | |||
clang++ -std=c++11 foo.cc | |||
<br> | |||
===== クラスの初期化 ===== | |||
C++11では、以下のようにクラスの初期化を定義できる。 | |||
<source lang="c++"> | |||
#include <iostream> | |||
class C | |||
{ | |||
private: | |||
int i; | |||
public: | |||
C (int ia) : i(ia) {} // ユーザ定義のコンストラクタ | |||
C () : C (123) {} // デフォルトコンストラクタ | |||
}; | |||
int main(int argc, const char *argv[]) | |||
{ | |||
C c; | |||
return 0; | |||
} | |||
</source> | |||
<br> | |||
===== コンテナクラスの初期化 ===== | |||
クラスでも初期化リストを扱えるように、std::initializer_listクラスガ追加された。<br> | |||
従来では、std::vectorクラスは、初期化リストを指定できず、push_back()で初期化するなどのコーディングを必要としていた。<br> | |||
<source lang="c++"> | |||
#include <vector> | |||
int main(int argc, char const* argv[]) | |||
{ | |||
vector<int> v = {1,2,3}; | |||
return 0; | |||
} | |||
</source> | |||
<br> | |||
std::mapクラスであれば、std::make_pair使用して更に面倒なコーディングが必要だったが、C++11では、以下のように記述できる。<br> | |||
<source lang="c++"> | |||
#include <map> | |||
#include <string> | |||
int main(int argc, char const* argv[]) | |||
{ | |||
map<string,int> m = { | |||
{"foo",1}, | |||
{"bar",2}, | |||
}; | |||
return 0; | |||
} | |||
</source> | |||
<br> | |||
===== 推論型 ===== | |||
変数の型を推論型にすることで、プログラミングが簡単・簡素になる。<br> | |||
autoとRange-Looped forを組み合わせることでループが簡単に記述できる。<br> | |||
<br> | |||
===== constexpr ===== | |||
constexprを使用することで、以下のような初期化ができる。<br> | |||
<source lang="c++"> | |||
#include <iostream> | |||
typedef struct tag_X | |||
{ | |||
int n; | |||
} X | |||
int main(int argc, const char *argv[]) | |||
{ | |||
constexpr X x = {123}; | |||
int a[x.n] = {1}; | |||
return 0; | |||
} | |||
</source> | |||
<br> | |||
===== nullptr ===== | |||
NULLの定義が0や0Lのため、オーバーロード時の評価で期待した結果が得られない問題あり、nullptrが導入された。<br> | |||
<source lang="c++"> | |||
#include <iostream> | |||
void f(double *fptr) | |||
{ | |||
std::cout << __PRETTY_FUNCTION__ << std::endl; | |||
} | |||
void f(int i) | |||
{ | |||
std::cout << __PRETTY_FUNCTION__ << std::endl; | |||
} | |||
int main(int argc, const char *argv[]) | |||
{ | |||
f(0); // f(int) | |||
f(nullptr); // f(double*) | |||
{ | |||
char *phoge1 = NULL; | |||
char *phoge2 = nullptr; | |||
if (phoge1 == phoge2) | |||
{ | |||
} | |||
} | |||
return 0; | |||
} | |||
</source> | |||
<br><br> | <br><br> | ||