13,009
回編集
細 (文字列「<source lang」を「<syntaxhighlight lang」に置換) |
|||
14行目: | 14行目: | ||
===== クラスの初期化 ===== | ===== クラスの初期化 ===== | ||
C++11では、以下のようにクラスの初期化を定義できる。 | C++11では、以下のようにクラスの初期化を定義できる。 | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
38行目: | 38行目: | ||
クラスでも初期化リストを扱えるように、std::initializer_listクラスガ追加された。<br> | クラスでも初期化リストを扱えるように、std::initializer_listクラスガ追加された。<br> | ||
従来では、std::vectorクラスは、初期化リストを指定できず、push_back()で初期化するなどのコーディングを必要としていた。<br> | 従来では、std::vectorクラスは、初期化リストを指定できず、push_back()で初期化するなどのコーディングを必要としていた。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <vector> | #include <vector> | ||
50行目: | 50行目: | ||
<br> | <br> | ||
std::mapクラスであれば、std::make_pair使用して更に面倒なコーディングが必要だったが、C++11では、以下のように記述できる。<br> | std::mapクラスであれば、std::make_pair使用して更に面倒なコーディングが必要だったが、C++11では、以下のように記述できる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <map> | #include <map> | ||
#include <string> | #include <string> | ||
65行目: | 65行目: | ||
<br> | <br> | ||
===== x.begin() / x.end()ではなくbegin(x) / end(x)を使用する ===== | ===== x.begin() / x.end()ではなくbegin(x) / end(x)を使用する ===== | ||
< | <syntaxhighlight lang="c++"> | ||
#include <vector> | #include <vector> | ||
#include <algorithm> | #include <algorithm> | ||
87行目: | 87行目: | ||
===== Range-Based Loop ===== | ===== Range-Based Loop ===== | ||
全要素に順次アクセスする場合は、Range-Based Loopを使用する。<br> | 全要素に順次アクセスする場合は、Range-Based Loopを使用する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// C++98, C++03の記述方法 | // C++98, C++03の記述方法 | ||
for(std::vector<double>::iterator i = dvec.begin(); i != dvec.end(); i++) | for(std::vector<double>::iterator i = dvec.begin(); i != dvec.end(); i++) | ||
103行目: | 103行目: | ||
===== constexpr ===== | ===== constexpr ===== | ||
constexprを使用することで、以下のような初期化ができる。<br> | constexprを使用することで、以下のような初期化ができる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
123行目: | 123行目: | ||
従来のnew / deleteではなく、スマートポインタを使用する。<br> | 従来のnew / deleteではなく、スマートポインタを使用する。<br> | ||
詳細は、[[スマートポインタの使い方(unique ptr)]]、[[スマートポインタの使い方(shared ptr)]]、[[スマートポインタの使い方(weak ptr)]]を参照する。<br> | 詳細は、[[スマートポインタの使い方(unique ptr)]]、[[スマートポインタの使い方(shared ptr)]]、[[スマートポインタの使い方(weak ptr)]]を参照する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <memory> | #include <memory> | ||
133行目: | 133行目: | ||
===== nullptr ===== | ===== nullptr ===== | ||
NULLの定義が0や0Lのため、オーバーロード時の評価で期待した結果が得られない問題あり、nullptrが導入された。<br> | NULLの定義が0や0Lのため、オーバーロード時の評価で期待した結果が得られない問題あり、nullptrが導入された。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
179行目: | 179行目: | ||
===== 2進数リテラル ===== | ===== 2進数リテラル ===== | ||
0bもしくは0Bのプレフィックスをつけて、数値の2進数リテラルを記述できる。<br> | 0bもしくは0Bのプレフィックスをつけて、数値の2進数リテラルを記述できる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
int i = 0b1100; // i = 12 | int i = 0b1100; // i = 12 | ||
</source> | </source> | ||
185行目: | 185行目: | ||
===== 実行時サイズの配列 ===== | ===== 実行時サイズの配列 ===== | ||
配列のサイズ(要素数)を実行時の値で指定できるようになる。<br> | 配列のサイズ(要素数)を実行時の値で指定できるようになる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
void f(std::size_t size) | void f(std::size_t size) | ||
{ | { | ||
196行目: | 196行目: | ||
構造体内の動的配列は、Variable Length Array In Structure(VLAIS)と呼ばれる。<br> | 構造体内の動的配列は、Variable Length Array In Structure(VLAIS)と呼ばれる。<br> | ||
C++14の実行時サイズ配列は、VLAISをサポートしない。<br> | C++14の実行時サイズ配列は、VLAISをサポートしない。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
void f(std::size_t size) | void f(std::size_t size) | ||
{ | { | ||
210行目: | 210行目: | ||
ラムダ式と同様に、通常の関数でもreturn文から戻り値の型を推論できる。<br> | ラムダ式と同様に、通常の関数でもreturn文から戻り値の型を推論できる。<br> | ||
return文のオペランドの式から推定される。<br> | return文のオペランドの式から推定される。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
auto f(); // 関数宣言では、戻り値の型は不明 | auto f(); // 関数宣言では、戻り値の型は不明 | ||
auto f(){return 123;}; // 関数f()の定義で、戻り値の型はintとなる。 | auto f(){return 123;}; // 関数f()の定義で、戻り値の型はintとなる。 | ||
219行目: | 219行目: | ||
decltype(auto)は、戻り値型の推定に追加された機能である。<br> | decltype(auto)は、戻り値型の推定に追加された機能である。<br> | ||
decltype(変数)で、変数の型と同じ型を指定できる。<br> | decltype(変数)で、変数の型と同じ型を指定できる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
auto a = 10; // int a = 10; と同義 | auto a = 10; // int a = 10; と同義 | ||
decltype(a) b; // int b; と同義 | decltype(a) b; // int b; と同義 | ||
227行目: | 227行目: | ||
===== ジェネリックラムダ ===== | ===== ジェネリックラムダ ===== | ||
ラムダ式のパラメータがジェネリックにできる。<br> | ラムダ式のパラメータがジェネリックにできる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
[](const auto& a, const auto& b){return a > b;}; | [](const auto& a, const auto& b){return a > b;}; | ||
</source> | </source> | ||
<br> | <br> | ||
また、Varadic template parameter(パラメーターパック)も使用できる。<br> | また、Varadic template parameter(パラメーターパック)も使用できる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
auto f = [](auto ... args) {}; | auto f = [](auto ... args) {}; | ||
f(); | f(); | ||
242行目: | 242行目: | ||
===== 一般化されたラムダキャプチャ ===== | ===== 一般化されたラムダキャプチャ ===== | ||
非staticデータメンバーにおいて、コピーキャプチャできる。<br> | 非staticデータメンバーにおいて、コピーキャプチャできる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
int x = 1; | int x = 1; | ||
auto f = [y=x, &z=x] { ... }; // xをコピーしたy, xの参照をキャプチャしたz | auto f = [y=x, &z=x] { ... }; // xをコピーしたy, xの参照をキャプチャしたz | ||
249行目: | 249行目: | ||
<br> | <br> | ||
ムーブキャプチャも同様にできる。<br> | ムーブキャプチャも同様にできる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
std::unique_ptr<int> p(new int(3)); | std::unique_ptr<int> p(new int(3)); | ||
auto f = [q = std::move(p)]{/* 何か処理 */;}; | auto f = [q = std::move(p)]{/* 何か処理 */;}; | ||
262行目: | 262行目: | ||
*: static, thread_local は除く | *: static, thread_local は除く | ||
* 変数書き換えの許可 | * 変数書き換えの許可 | ||
< | <syntaxhighlight lang="c++"> | ||
constexpr int abs(int i) | constexpr int abs(int i) | ||
{ | { | ||
277行目: | 277行目: | ||
変数定義にテンプレートを使用できる。<br> | 変数定義にテンプレートを使用できる。<br> | ||
詳細については、[https://kaworu.jpn.org/cpp/変数テンプレート 変数テンプレート(Variable Templates)を参照]すること。<br> | 詳細については、[https://kaworu.jpn.org/cpp/変数テンプレート 変数テンプレート(Variable Templates)を参照]すること。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
template <class T> constexpr T pi = T(3.1415); | template <class T> constexpr T pi = T(3.1415); | ||
294行目: | 294行目: | ||
数値区切りとは、数値リテラルを単一引用符で区切る機能である。<br> | 数値区切りとは、数値リテラルを単一引用符で区切る機能である。<br> | ||
区切りの桁は任意であり、大きな数字は、区切りを入れたほうが「人に解りやすい」というメリットがある。<br> | 区切りの桁は任意であり、大きな数字は、区切りを入れたほうが「人に解りやすい」というメリットがある。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
int a = 1'000; // 千 | int a = 1'000; // 千 | ||
long int b = 1'000'000; // 100万 | long int b = 1'000'000; // 100万 | ||
301行目: | 301行目: | ||
<br> | <br> | ||
2進数や16進数も区切ると見やすくなる。<br> | 2進数や16進数も区切ると見やすくなる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
uint16_t a = 0b11110000'00001111; // 1[byte]ずつ区切る | uint16_t a = 0b11110000'00001111; // 1[byte]ずつ区切る | ||
uint32_t b = 0xff'00'ff'ff; // 1[byte]ずつ区切る | uint32_t b = 0xff'00'ff'ff; // 1[byte]ずつ区切る | ||
307行目: | 307行目: | ||
<br> | <br> | ||
小数点を区切ることもできる。<br> | 小数点を区切ることもできる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
double pi = 3.14159'26535; | double pi = 3.14159'26535; | ||
</source> | </source> | ||
314行目: | 314行目: | ||
deprecated属性は、エンティティを非推奨扱いする属性である。<br> | deprecated属性は、エンティティを非推奨扱いする属性である。<br> | ||
「非推奨扱いの名前」が使用される場合、「警告メッセージ」を出力させることができる。<br> | 「非推奨扱いの名前」が使用される場合、「警告メッセージ」を出力させることができる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// 非推奨の関数 | // 非推奨の関数 | ||
[[deprecated]] char * gets(char *str); | [[deprecated]] char * gets(char *str); |