C ++エントリの基本的な知識の要約(2022年の仕上げ)

1. C++エントリの基本的な知識C++とは何ですか?

1982年、Bjarne Stroustrup博士は、C言語に基づくオブジェクト指向の概念を導入および拡張し、新しいプログラミング言語を発明しました。言語とC言語の関係を表すために、C++と名付けられています。したがって、C ++はC言語に基づいており、C言語の手続き型プログラミングを実行できるだけでなく、抽象データ型を特徴とするオブジェクトベースのプログラミングも実行でき、オブジェクト指向プログラミングも実行できます。 。

C ++エントリPDFバージョン、C ++改善チュートリアル、C++電子書籍の基本的な知識は次のように取得できます。

WeChatパブリックアカウントに注意してください:「CandCplus」キーワードに返信:「C++」を受け取る

次に、C ++エントリの基本的な知識は、C++の履歴バージョンを調べます。

  • クラスクラスと派生クラス、パブリックメンバーとプライベートメンバー、クラス構築とデストラクタ、フレンド、インライン関数、代入演算子のオーバーロードなどを含むC。

  • C ++ 1.0は、仮想関数、関数と演算子のオーバーロード、参照、定数などの概念を追加します。

  • C ++ 2.0は、オブジェクト指向の新しい保護されたメンバー、多重継承、オブジェクトの初期化、抽象クラス、静的メンバー、およびconstメンバー関数をより完全にサポートします。

  • C ++ 3.0は、多重継承および対応する構築と破棄の処理によって引き起こされるあいまいさの問題を解決するためのテンプレートを導入することにより、さらに改善されています。

  • ほとんどのコンパイラでサポートされているC++98 C ++標準の最初のバージョンは、国際標準化機構(ISO)と米国標準化機構によって認識され、C ++標準ライブラリをテンプレート形式で書き直し、STL(標準テンプレートライブラリ)

  • C ++ 03 C ++標準の2番目のバージョンである言語機能は、主に、エラーの修正、多様性の削減など、あまり変更されていません。

  • C ++ 05 C ++標準委員会は、正式にC ++ 0xに名前が変更されたテクニカルレポート(TR1)をリリースしました。つまり、今世紀の最初の10年間にリリースされる予定です。

  • C ++ 11には、正規表現、範囲ベースのforループ、autoキーワード、新しいコンテナー、リストの初期化、標準のスレッドライブラリなど、C++を新しい言語のようにする多くの機能が追加されています。

  • C++14からC++11への拡張は、主にC ++ 11の脆弱性と改善点を修正することです。たとえば、ジェネリックラムダ式、自動戻り値型の推定、バイナリリテラル定数などです。

  • C ++ 17は、C ++ 11にいくつかのマイナーな改善を加え、static_assert()のオプションのテキスト情報、変数テンプレートのFold式、ifおよびswitchステートメントの初期化子などの19の新機能を追加しました。

3つのC++基本知識キーワード

C++には合計63個のキーワードがあります。

丸で囲んだものはC言語のキーワードです。这里要注意了:false和true并不是C语言的关键字。

第4に、C++エントリ基盤のC++名前空間

C / C ++では、変数、関数、およびクラスが多数存在し、これらの変数、関数、およびクラスの名前がグローバルスコープに適用されるため、多くの名前の競合が発生する可能性があります。

名前空間を使用する目的は、名前の競合や名前の汚染を回避するために識別子と名前をローカライズすることです。名前空間キーワードは、この問題に対処しているようです。

名前空間を定義するには、名前空間キーワード、名前空間の名前、{}のペアを使用する必要があります。ここで、{}は名前です。

スペースのメンバー。

注:名前空間は新しいスコープを定義し、名前空間内のすべてはその名前空間に制限されます

1.名前空間の一般的な定義

2.名前空間はネストできます

3.同じプロジェクトで同じ名前の複数の名前空間が許可され、コンパイラーは最終的にそれらを同じ名前空間に合成します。

上記のxjt名前空間とマージされます

5、C++エントリの基本的な名前空間の使用

もちろん、このようにprintfのアドレスを呼び出すため、printfを直接印刷することはできません。そのため、この結果が表示されます。正の呼び出しメソッドは次の3つです。

1.名前空間名とスコープ修飾子を追加します

シンボル「::」はC++ではスコープ修飾子と呼ばれ、「namespace name ::namespacemember」を介して名前空間内の対応するメンバーにアクセスできます。

2.名前空間の名前空間名を使用して紹介します

ただし、この方法にはいくつかの欠点があります。名前空間でprintfという名前の変数を定義した場合、後で名前空間xjtを導入すると、名前の汚染が発生します。

この問題を解決するために、3番目の導入方法が登場しました。

3.名前空間にメンバーを導入するためにusingを使用します

このアプローチは、汚染の一部しか導入しないため、名前の汚染を防ぎます。

6.C++エントリの基本的な知識の入力と出力

C言語には標準の入出力関数scanfとprintfがありますが、C++にはcin標準入力とcout標準出力があります。C言語でscanfおよびprintf関数を使用するには、ヘッダーファイルstdio.hをインクルードする必要があります。C ++でcinとcoutを使用するには、ヘッダーファイルiostreamとstd標準名前空間をインクルードする必要があります。

C ++の入出力メソッドは、C言語よりも便利です。これは、C ++の入出力がフォーマットを制御する必要がないためです。たとえば、整数型は%d、文字型は%cです。

注:endl、この中のlはアラビア数字の1ではなく、26文字の英字のlであり、これは改行に相当します。

ここでは、cinの特性にも注意を払う必要があります。これはC言語のgetsに似ています。改行に遭遇するとgetsが停止しますが、cinはスペース、タブ、または改行を区切り文字として使用するため、ここにhelloworldと入力します。スペースで。

ここではhelloworldを入力しましたが、入力時にスペースがあるため、それ以降のコンテンツは読み取られないため、helloはarrに格納されます。

7.C++エントリの基本的な知識-デフォルトのパラメータ

デフォルトパラメータは、関数が宣言または定義されて、関数のパラメータのデフォルト値を指定する場合です。関数を呼び出すとき、
引数が指定されていない場合はデフォルト値が使用され、指定されていない場合は指定された引数が使用されます。

1.すべてのデフォルト

すべてのデフォルトパラメータ、つまり、関数のすべての正式なパラメータがデフォルトパラメータに設定されます。

2.セミデフォルトパラメータ

知らせ: 

  • セミデフォルトパラメータは、右から左に順番に指定する必要があり、間隔を置いて指定することはできません。

  • デフォルトのパラメーターは、関数の宣言と定義の両方に表示することはできません

理由:宣言と定義が同時に発生し、2つの場所が異なる値を提供する場合、コンパイラーはどちらのデフォルト値を使用するかを決定できません。

  • デフォルト値は定数またはグローバル変数である必要があります。

8つのC++の基本-C++関数のオーバーロード

1.関数のオーバーロード

関数のオーバーロードは関数の特殊なケースです。C++では、同じスコープで同様の関数を持つ同じ名前の複数の関数を宣言できます同じ名前のこれらの関数の正式なパラメーターリスト(パラメーターの数、タイプ、または順序)は次のようになります。異なる。異なるデータ型で同様の関数を実装する

注:戻り値のみが異なり、他のすべてが同じである場合、それは関数のオーバーロードを構成しません。

2.C++関数のオーバーロードの原理

C ++が関数のオーバーロードをサポートしているのに、C言語はサポートしていないのはなぜですか?

ここでは、以前の知識を確認します。実行可能ファイルを実行する前に、プリコンパイル、コンパイル、アセンブル、これらのステージのリンクを実行する必要があります。

実際、ここではC ++言語とC言語がわずかに異なるため、問題はコンパイル後のアセンブリ段階にあります。見てみましょう。

C言語コンパイラでコンパイルした後

C++コンパイラでコンパイルした後

要約:

  • 実際、最終的な分析では、CコンパイラとC++コンパイラの装飾が異なるためです。gccでの変更規則は、[_Z+関数の長さ+関数名+
    最初の文字の入力]です。

  • これは、装飾ルールが戻り値の影響を受けないため、関数の戻りタイプが異なり、関数のオーバーロードを構成しない理由を実際に示しています。

3、外部「C」

C ++プロジェクトでは、Cスタイルに従って一部の関数をコンパイルし、関数の前にextern "C"を追加する必要がある場合があります。これは、コンパイラに次のことを通知することを意味します。

この関数は、C言語の規則に従ってコンパイルされます。例:tcmallocは、GoogleによってC ++で実装されたプロジェクトであり、tcmallc()とtcfreeを提供します。

2つのインターフェースが使用されますが、Cプロジェクトの場合は使用できないため、extern"C"を使用して解決します。

9、C++エントリの基本-リファレンス

1.見積もり

参照は、新しい変数を定義することではなく、既存の変数のエイリアスを取得することです。コンパイラは、参照変数のメモリスペースを開かず、参照する変数と同じメモリスペースを共有し
ます

タイプと参照変数名(オブジェクト名)=参照エンティティ;

注:参照タイプは、参照エンティティと同じタイプである必要があります

2.リファレンスの特徴

  • 参照は、定義時に初期化する必要があります

  • 変数は複数の参照を持つことができます

  • 参照がエンティティを参照すると、別のエンティティを参照することはできません

しかし、実際の効果は、cの値が実際にbに割り当てられ、bがaの参照であるため、aの値が20になることです。

3.よく引用される

上記のように、参照タイプは参照エンティティと同じタイプである必要があります。ただし、同じタイプでも参照が成功することを保証するものではありません。ここでは、参照を変更できるかどうかという問題にも注意を払う必要があります。

ここで、a、b、dはすべて定数であり、定数は変更できませんが、int&raを使用してaを参照すると、参照されるaを変更できるため、問題が発生します。
このコードを見てみましょう。

この引用は正しいですか?この問題を理解するには、まず隠者型プロモーションの問題を理解する必要があります。ここでは、intからdoubleへの隠者型プロモーションがあり、プロモーションプロセス中に、システムは型プロモーションの結果を格納するための一定の領域を作成します。 。したがって、ここでは、このコードは一見間違っています。隠者タイプがプロモートされるときにaが定数領域に格納され、定数領域を変更できず、double&raを使用して参照すると、raの参照を変更できるためです。 。

constを追加すると、この問題を解決できます。

注:変更不可能な数量を読み取り可能および書き込み可能な数量として参照することはできませんが、その逆は可能であり、読み取り可能および書き込み可能な数量を読み取り可能な数量として参照することは可能です。

4.参照使用シナリオ

  • パラメータとしての参照

    C言語の交換関数を覚えておいてください。C言語を学習するとき、交換関数は、値渡しと参照渡しの違いを説明するためによく使用されます。参照について学習したので、ポインタをパラメータとして使用できます。ここでaとbは着信引数への参照であるため、aとbの値を交換します。これは、2つの着信引数を交換することと同じです。

  • 戻り値としての参照

    もちろん、参照は戻り値として使用することもできますが、関数内で定義された通常のローカル変数は最後に破棄されるため、返すデータは関数内で作成された通常のローカル変数ではないことに特に注意する必要があります。関数呼び出しの。返すデータは、静的に変更するか、動的に作成するか、グローバル変数や、関数呼び出しの終了時に破棄されないその他のデータである必要があります。

    静的を追加しないことの結果

なぜ2ではなく7を印刷するのか疑問に思っていますか?

これはさらに奇妙なことですが、ランダムな値を出力するために中央にprintfを追加するのはなぜですか?
分析を見てみましょう:

ランダムな値が表示されるのはなぜですか?関数で定義した変数は一時変数であり、関数を終了すると関数は破棄されます。このとき、関数はメモリ内のスペースをランダムに指しますしたがって、関数の戻り値として参照する場合は、関数で定義された変数にstaticを追加することをお勧めします。

この時点で、あなたはこのコードを本当に理解していると思いますか?

多分あなたは好奇心が強いでしょう?なんでここ3なの?分析を見てみましょう

実際、書き方を変えると、ここの結果は7に変わります。理由も非常に単純です。これが上の写真の理由です。

注:関数が関数スコープから戻り、返されたオブジェクトがシステムに返されていない場合は、参照を使用して返すことができます。システムに返された場合は、値による戻りを使用する必要があります。
この文は次の例を示しています。

この参照渡しの戻り値を使用するのは奇妙だと思いますか。それがどのように返されるかを分析してみましょう。

要約:
传值的过程中会产生一个拷贝,而传引用的过程中不会,其实在做函数参数时也具有这个特点。

5.参照とポインタの違い

構文に関しては、参照はエイリアスであり、独立したスペースがなく、参照エンティティと同じスペースを共有します。

参照はポインタとして実装されているため、基になる実装には実際にはスペースがあります。

参照とポインタのアセンブリコードの比較を見てみましょう

参照とポインタの違い

  • 参照は、定義時に初期化する必要があります。ポインターは必要ありません。

  • 参照が初期化されたときにエンティティを参照した後は、他のエンティティを参照することはできず、ポインタはいつでも同じタイプの任意のエンティティを指すことができます。

  • NULL参照はありませんが、NULLポインターがあります。

  • sizeofの意味は異なります。参照の結果は参照型のサイズですが、ポインターは常にアドレス空間が占めるバイト数(32ビットプラットフォームでは4バイト)です。

  • 参照の自己インクリメント操作は、エンティティを1増やすことと同じであり、ポインターの自己インクリメント操作は、ポインターが型のサイズによってオフセットされることです。

  • 複数のレベルのポインターがありますが、複数のレベルの参照はありません。

  • エンティティへのアクセス方法は異なり、ポインタは明示的に逆参照する必要があり、参照はコンパイラ自体によって処理されます。

  • 参照は、ポインターよりも比較的安全に使用できます。

10.C++エントリの基本的な知識-インライン関数

1.コンセプト

インラインで装飾された関数はインライン関数と呼ばれます。コンパイル時に、C ++コンパイラは、関数のスタックのオーバーヘッドなしに、インライン関数が呼び出される場所を拡張し、インライン関数は
プログラム操作の効率を向上させます。(太字の部分を見ると、友達は間違いなく、これはc言語のマクロと非常に似ていると思いますか?)

上記の関数の前にinlineキーワードを追加してインライン関数に変更すると、コンパイラはコンパイル中に関数呼び出しを関数本体に置き換えます。

2.機能

  • インラインは、スペースを時間と交換する方法であり、関数を呼び出すオーバーヘッドを排除します。したがって、長いコード/再帰関数は、インライン関数として使用するのには適していません。

  • インラインはコンパイラーへの単なる提案であり、コンパイラーはそれを自動的に最適化します。インラインとして定義された関数の本体コードが比較的長い/再帰的である場合など、コンパイラーは最適化時にインラインを無視します。

  • Inlineは、宣言と定義の分離を推奨していません。分離すると、リンクエラーが発生します。インラインが展開されているため、関数アドレスがなく、リンクが見つかりません。

マクロを置き換えるC++のテクニックは何ですか

  • 定数定義をconstに置き換えます

  • 関数定義をインライン関数に置き換えます

11、自動キーワード(C ++ 11)

C / C ++の初期の頃、autoの意味は次のとおりでした。autoで装飾された変数は自動ストレージを備えたローカル変数ですが、残念ながら誰もそれを使用したことがありません。

C ++ 11では、標準委員会はautoに新しい意味を与えました。autoはもはやストレージタイプインジケーターではありませんが、autoによって宣言された変数はコンパイラーによってコンパイルされる必要があることをコンパイラーに指示する新しいタイプインジケーターとして。この文章を読んだだけでは理解できないかもしれませんが、いくつか例を挙げましょう。

#include<iostream>

using namespace std;

int TestAuto()

{

return 10;

}

int main()

{

int a = 10;

auto b = a;

auto c = 'a';

auto d = TestAuto();



cout << typeid(b).name() << endl; //这个地方要学到后面类的时候才可以解释,这里打印出的是类型名

cout << typeid(c).name() << endl;

cout << typeid(d).name() << endl;



cout << a << endl;

cout << b<< endl;

cout << c << endl;

cout << d << endl;



//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化

return 0;

}

注:autoを使用して変数を定義する場合は、初期化する必要があります。コンパイルフェーズでは、コンパイラは初期化式に従って実際のautoのタイプを推測する必要があります。したがって、autoは「型」宣言ではなく、型が宣言されたときの「プレースホルダー」です。コンパイラーは
、コンパイル時にautoを変数の実際の型に置き換えます。

1.自動車の使用に関する規則

  • autoは、ポインターおよび参照と組み合わせて使用​​されます

autoでポインタ型を宣言する場合、autoとauto *の違いはありませんが、autoで参照型を宣言する場合は、&を追加する必要があります。

注:autoを使用して参照を宣言する場合は、&を追加する必要があります。そうしないと、エンティティと同じタイプの通常の変数が作成されますが、名前は変更されます。

  • 同じ行に複数の変数を定義する

同じ行で複数の変数を宣言する場合、これらの変数は同じ型である必要があります。そうでない場合、コンパイラは実際に
は最初の型のみを推定し、推定された型で他の変数を定義するため、エラーを報告します。

2.自動で推測できないシナリオ

  • 関数パラメーターとしてのauto

  • autoを直接使用して配列を宣言することはできません

C ++ 98でのautoとの混同を避けるために、C ++ 11は型インジケーターとしてのautoの使用のみを保持します
。実際のautoの最も一般的な利点は、C++11によって提供される新しいスタイルです。後で説明します。forループ、ラムダ式などを一緒に使用できます。

12. C ++エントリ範囲ベースのforループ(C ++ 11)の基本的な知識

1.範囲の構文

C ++ 98では、配列をトラバースする場合は、次のように実行できます。

範囲コレクションの場合、プログラマーがループの範囲を指定することは冗長であり、エラーが発生しやすい場合があります。したがって、C++11では

範囲ベースのforループが導入されました。forループの後の括弧は、コロン「:」によって2つの部分に分割されます。最初の部分は反復に使用される範囲の変数であり、2番目の部分は反復される範囲を表します。

自動として書き込むことはできません。そうでない場合、元の配列を変更することはできません。

正しいスペル

注:通常のループと同様に、continueを使用して現在のループを終了できます。また、breakを使用してループ全体からジャンプすることもできます。

2.スコープの使用条件

  • forループの反復の範囲は決定論的でなければなりません

配列の場合、これは配列の最初の要素と最後の要素の範囲です。クラスの場合、beginメソッドとend
メソッドを指定する必要があり、beginとendはforループの反復の範囲です。

注:forのスコープが不確定であるため、次のコードには問題があります。

  • iterableオブジェクトは、++および==の操作を実装します。

イテレータについては後で説明しますが、理解できるようになりました。

13、C++エントリの基盤-ポインタnull値nullptr

1. C++98のポインタnull値

優れたC/C ++プログラミング手法では、変数を宣言するときに、変数に適切な初期値を指定することをお勧めします。そうしないと、予期しないエラーが発生する可能性があります。たとえば、初期化されていないポインタの場合、ポインタに有効なポインタがない場合は、基本的に次のように初期化します。

NULLは実際にはマクロです。従来のCヘッダーファイル(stddef.h)で次のコードを確認できます。

ご覧のとおり、NULLは、リテラル定数0として、または型指定されていないポインター(void *)を持つ定数として定義できます。どのような定義を採用しても、null値を持つポインターを使用すると、次のような問題が発生することが避けられません。

プログラムの本来の目的は、Fun(NULL)を介してFun(int * p)関数のポインターバージョンを呼び出すことですが、NULLは0として定義されているため、Fun(NULL)は最終的にFun(int p)関数を呼び出します。

注:C ++ 98では、リテラル定数0は整数または型なしポインター(void *)定数のいずれかですが、コンパイラーはデフォルトで整数定数として扱います。ポインターとして使用するには、次のようにする必要があります。キャストされます。

2. C++11のポインタnull値

C ++ 98の問題については、C++11でキーワードnullptrが導入されました。

nullptrを使用してポインタnullを表す場合、nullptrはC ++ 11でキーワードとして導入されたため、ヘッダーファイルをインクルードする必要はありません。

C ++ 11では、sizeof(nullptr)とsizeof((void *)0)は同じバイト数を占め、どちらもサイズは4です。

最後に

C ++エントリPDFバージョン、C ++改善チュートリアル、C++電子書籍の基本的な知識は次のように取得できます。

WeChatパブリックアカウントに注意してください:「CandCplus」キーワードに返信:「C++」を受け取る

おすすめ

転載: blog.csdn.net/weixin_55305220/article/details/123685978