C ++ 11の新機能
- autoキーワード(C ++ 11)範囲ベースのforループ(C ++ 11)ポインターnullptr(C ++ 11)
- C ++動的メモリ管理
- シリアルコンテナー配列forward_list;
- 継承とポリモーフィズム:最終的なオーバーライド
- 削除:デフォルトのメンバー関数を生成しません
- default:コンパイラーにデフォルトのメンバー関数を生成させる
- スマートポインター:unique_ptr、shared_ptr、weak_ptr
- ハッシュ構造の連想コンテナ:順不同シリーズ
統一された初期化
C ++ 98の標準では、中括弧{}を使用して配列要素の統一リスト初期値を設定できます
int array1[] = {1,2,3,4,5};
int array2[5] = {0};
これはベクターコンテナーに対して初期化できません
vector<int> v{1,2,3,4,5};
コンパイルできないため、ベクターを定義するたびに、まずベクターを定義してから、ループを使用して初期値を割り当てる必要があり、非常に不便です。
C ++ 11は、中かっこで囲まれたリスト(初期化リスト)のスコープを拡張し、すべての組み込み型およびユーザー定義型で使用できるようにします。初期化リストを使用する場合は、等号(=)を追加することもできます。追加できません。
組み込み型の中括弧{}の初期化
// 内置类型变量
int x1 = { 10 };
int x2{ 10 };
int x3 = 1 + 2;
int x4 = { 1 + 2 };
int x5{ 1 + 2 };
int x6{ x1 + x2 };
// 数组
int arr1[5] {1, 2, 3, 4, 5};
int arr2[]{1, 2, 3, 4, 5};
// 动态数组,在C++98中不支持
int* arr3 = new int[5]{1, 2, 3, 4, 5};
// 标准容器
vector<int> v{ 1, 2, 3, 4, 5 };
map<int, int> m{ { 1, 1 }, { 2, 2, }, { 3, 3 }, { 4, 4 } };
単一のカスタムタイプリストの初期化
class Point
{
public:
Point(int x = 0, int y = 0)
: _x(x), _y(y)
{}
private:
int _x;
int _y;
};
int main()
{
//两种初始化都可以
Point p{ 1, 2 };
Point p2(1, 2);
return 0;
}
複数のカスタムタイプリストの初期化
複数のオブジェクトのリスト初期化をサポートする場合は、initializer_list型パラメーターを使用してクラス(テンプレートクラス)にコンストラクターを追加する必要があります。注:initializer_listはシステム定義のクラステンプレートです。このクラステンプレートには、間隔の要素数を取得するためのbegin()、end()イテレータ、およびsize()メソッドの3つの主要なメソッドがあります。
template<class T>
class vector
{
public:
vector()
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{}
vector(initializer_list<T>l)
:_start(new T[l.size()])
{
_finish = _start;
for (auto e : l)
{
*_finish++ = e;
}
}
private:
T* _start;
T* _finish;
T* _endofstorage;
};
変数型の控除
自動導出
decltype型の控除
autoを使用するための前提条件は、autoによって宣言された型を初期化する必要があります。そうしないと、コンパイラーはautoの実際の型を導出できません。
template<class T1,class T2>
//返回的时候,返回T1和T2都不行,应该返回T1+T2后的值的类型
auto Add(const T1& left, const T2& right)
{
return left + right;
}
追加後の結果の実際のタイプを関数の戻りタイプとして使用できる場合、エラーは発生しませんが、これには、プログラムが実行されて
、結果の実際のタイプ、つまりRTTI(ランタイムタイプ識別)を知る必要があります。
typeid
タイプを表示するだけで、結果クラスでタイプを定義することはできませんdynamic_cast
仮想関数を含む継承システムでのみ使用できます
新しいキーワードが必要です
decltypeは、式の実際のタイプに基づいて変数を定義するために使用されるタイプです。例:戻り値タイプの控除
//此处auto为占位符
//返回值类型追踪
auto Add( T1& left, T2& right)->decltype(left+right)
{
return left + right;
//ret = left + right;
}
int main()
{
int a = 1;
double b = 2.0;
cout<< Add(a, b);
return 0;
}
ループの範囲
の範囲
最終および上書き
ポリモーフィズムに要約
スマートポインター
スマートポインターの概要
新しいコンテナー静的配列配列、forward_list、および順序なしシリーズ
デリゲートコンストラクター
いわゆる委任コンストラクター:作成されたタスクを委任関数がターゲットコンストラクターに委任するクラス構築メソッドを指します。
初期化リストで「ベンチマークバージョン」を呼び出すコンストラクターはデリゲートコンストラクターと呼ばれ、呼び出された「ベンチマークバージョン」はターゲットコンストラクターと呼ばれます。
注:コンストラクターは、「委任」と同時に初期化リストを使用することはできません。
class Info {
public:
Info()
: _type(0)
, _name('a')
{
InitRSet();
}
Info(int type)
:Info()
//不能再在初始化列表中初始化其它的成员变量
//,_type(type)
{
//InitRSet();
_type = type;
}
Info(char type)
:Info()
{
//InitRSet();
_type = type;
}
private:
void InitRSet()
{
//初始化其他变量
}
private:
int _type;
char _name;
//...
};
- デリゲートコンストラクターをターゲットコンストラクターにすることもできます
- 覚えておいてください:リングの委任は引き続きコンパイルできますが、適切なスタックでオーバーフローします
右辺値参照
デフォルトの機能制御
C ++ 11により、プログラマーは、コンパイラーがデフォルトで生成される関数を生成する必要があるかどうかを制御できます
明示的なデフォルト関数
C ++ 11では、デフォルト関数の定義または宣言に= defaultを追加して、関数のデフォルトバージョンを生成するようコンパイラーに明示的に指示できます。=default
変更された関数は、明示的デフォルト関数と呼ばれます。
class A
{
public:
A(int a): _a(a)
{}
// 显式缺省构造函数,由编译器生成
A() = default;
// 在类中声明,在类外定义时让编译器生成默认赋值运算符重载
A& operator=(const A& a);
private:
int _a;
};
A& A::operator=(const A& a) = default;
int main()
{
A a1(10);
A a2;
a2 = a1;
return 0;
}
デフォルト関数を削除する
特定のデフォルト関数の生成を制限したい場合、C ++ 98では、関数はプライベートに設定され、定義されていないため、他の誰かがそれを呼び出したい場合、エラーが報告されます。C ++ 11ではより単純です。関数宣言に= deleteを追加するだけです。この構文は、対応する関数のデフォルトバージョンを生成しないようにコンパイラーに指示します。= deleteによって変更された関数は、delete関数と呼ばれます。
class A
{
public:
A(int a): _a(a)
{}
// 禁止编译器生成默认的拷贝构造函数以及赋值运算符重载
A(const A&) = delete;
A& operator(const A&) = delete;
private:
int _a;
};
int main()
{
A a1(10);
// 编译失败,因为该类没有拷贝构造函数
//A a2(a1);
// 编译失败,因为该类没有赋值运算符重载
A a3(20);
a3 = a2;
return 0;
}
注:明示的に削除関数を使用しないでください