「C++の変更点」の版間の差分

ナビゲーションに移動 検索に移動
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>


案内メニュー