C++17の新機能は何ですか
c 17 の新機能には次のものが含まれます: 1. 自動式導出のルールの変更; 2. ラムダ式で「*this」をキャプチャできる; 3. ヘッダー ファイルでグローバル変数を直接定義できる新しいインライン変数; 4. 条件式での初期化ステートメントをサポート; 5. 列挙型の直接リスト初期化など。
このチュートリアルの動作環境: Windows 7 システム、C 17 バージョン、Dell G3 コンピューター。
関連する推奨事項: 「C ビデオ チュートリアル 」
C 17 の新機能
1. auto キーワード
c 11 以降、auto キーワードは初期化子を通じて変数の型を推測できます。 C 14 では、auto キーワードの機能がさらに改良され、関数の戻り値の型を return ステートメントを通じて推定できるようになりました。 auto キーワードを使用すると、コーディング効率が向上し、再構成プロセスが簡素化されます。ただし、C 11 での自動導出では、予想とは異なる結果が得られることがよくあります。
c 11 で統合初期化をサポートするために、次に示すように、新しい統合初期化構文が導入されました。
// c++11 auto x3{ 1, 2 }; // std::initializer_list<int> auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> auto x5{ 3 }; // std::initializer_list<int>
これら 3 つの方法で初期化された変数の場合、最終的な型導出結果は、私たちが考える int ではなく、std::initializer_list になります。これは、変数 auto を宣言する式を {} で囲んだ場合、推定される型が std::initializer_list となるためです。
C 17 では、auto 式導出のルールが変更されました
// c++17 auto x3{ 1, 2 }; // error: not a single element auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> auto x5{ 3 }; // decltype(x5) is int
比較の結果、auto x5{3} は変数を x5 に直接導出するのに対し、x3{1, 2} は変数を直接導出することがわかりました。このメソッドもコンパイルに失敗します。自動導出のルールがより直感的になりました。
2. ラムダ式
lambda は C 11 でも導入されました。C 11 では、ラムダ式は現在のオブジェクトである this のみをキャプチャできます。唯一の参考。 C 17 では、現在のオブジェクトのコピーである *this をキャプチャできます。現在のオブジェクトのコピーをキャプチャすると、現在のオブジェクトが解放された後、ラムダ式で this 内の変数とメソッドを安全に呼び出すことができます。
3. インライン変数
インライン変数では、変数を複数回定義できます。 C 17 より前では、グローバル変数を定義するときは、常に cpp ファイル内で変数を定義し、その後 extern キーワードを使用して変数が別の場所で定義されていることをコンパイラに伝える必要がありました。インライン変数が表示された後は、再定義エラー メッセージを気にすることなく、ヘッダー ファイル内でグローバル変数を直接定義できます。
4. 条件式で初期化ステートメントがサポートされます
c 17 は、if ステートメントまたは switch ステートメントでの初期化をサポートします。この機能の出現により、コードをより簡潔にすることができます。
// c++17之前 map<int, string> c = {{1,"a"}}; { auto res = c.insert(make_pair(2, "b")); if(!res.second) { cout << "key 1 exist" << endl; } else { cout << "insert success, value:" << res.first->second << endl; } }
上記のコードでは、res は一時変数であり、後続のコードに影響を与えたくないため、中括弧のペアを使用してスコープを制限しています。ただし、c 17 の構文を使用し、if 条件で res を初期化すると、コードはより簡潔に表示されます。
// c++17 map<int, string> c = {{1,"a"}}; if(auto res = c.insert(make_pair(2, "b")); !res.second ) { cout << "key 1 exist" << endl; } else { cout << "insert success, value:" << res.first->second << endl; }
c 17 の標準ライブラリも拡張され、次のデータ型が追加されました。
1. std::variant
std::variant はタイプセーフな共用体であり、共用体の拡張バージョンです。Variant は、次のようなより複雑なデータ型をサポートします。 map 、 string など
2. std::optional
std::optional は可能な値を表します。関数を通じてオブジェクトを作成する場合、通常は関数を使用してエラー コードを返し、パラメータを通じてオブジェクト自体を返します。
std::optional では、
has_value() // 检查对象是否有值 value() // 返回对象的值,值不存在时则抛出 std::bad_optional_access 异常 value_or() // 值存在时返回值,不存在时返回默认值
3. std::any# で作成したインスタンスを返すと、より直感的になります。
##任意の値を保存できるタイプセーフなコンテナー4. std::string_view
string_view c17 でブースト バージョンの string_view を初めて使用しました。ブーストと似ています。 string_view は、元の文字列への読み取り専用の参照として理解できます。 string_view 自体は、元の文字列データを保存するための追加メモリを適用せず、元の文字列のアドレスと長さを保存するだけです。多くの場合、文字列は一時的に処理されるだけであり、元の文字列のコピーは必要ありません。 string_view を使用すると、不必要なメモリ コピーが削減され、プログラムのパフォーマンスが向上します。文字列ポインターを使用する場合と比較して、string_view はより適切なカプセル化を提供します。 string_view には元の文字列の所有権がないため、string_view を使用する場合は元の文字列のライフサイクルに注意する必要があることに注意してください。元の文字列が破棄されると、string_view を呼び出すことができなくなります。その他の機能:
さらに、C 17 ではその他の機能も追加されていますが、この記事では 1 つずつ挙げていません。- ブール式は使用できません。これら 2 つの増分 (減少) 演算子は使用されなくなりました
- #c 17 の例外は、 type システムの一部、
- 列挙型の直接リスト初期化
- 構造化バインディング
- constexpr if 式
- map はマージと抽出をサポートします
プログラミング関連の知識について詳しくは、プログラミング学習をご覧ください。 !
以上がC++17の新機能は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

CharおよびUnsigned Charは、文字データを保存する2つのデータ型です。主な違いは、負と正の数に対処する方法です:値範囲:char署名(-128〜127)、および符号なしのchar unsigned(0〜255)。負の数処理:charは負の数を保存でき、符号なしのcharはできません。ビットモード:char最高ビットは、シンボル、符号なしのchar unsignedビットを表します。算術操作:charおよびunsigned charが署名されており、署名されていないタイプがあり、それらの算術操作は異なります。互換性:charおよびunsigned char

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。
