目次
1. はじめに
今年ブルーブリッジカップに参加しました。学習の過程で、多くのチュートリアルのプログラミング言語が C++ であることに気づきました。1 年生から C 言語を学習しましたが、まだ少し慣れていません。 C++ を直接学ぶことにしました。
1年生の前期では、オブジェクト指向プログラミング言語であるC言語、プログラミングの基礎を学びました。
1 年生の次の学期にオブジェクト指向プログラミング (Java) を学び、その時初めてオブジェクト指向とプロセス指向の違いが少しずつ理解できるようになりました。
「待望の名前」C++は、C言語のプロセス指向プログラミングの特徴を継承するだけでなく、包括的な機能を備えたオブジェクト指向プログラミング言語でもあります~~
2、違い
1. オブジェクト指向とプロセス指向
まず、上記の点ですが、C 言語はプロセス指向プログラミング言語であり、C++ はオブジェクト指向プログラミング言語であり、実際には C++ の方が広く使用されています。
2. 文法の違い - 引用
C++ を学ぶ前、私が最も懸念していたのは構文の違いでした。主にコードを理解する際の障害が原因でした。学習チャンネルに関しては、主に局のダークホースプログラマーのコースを見ることによって行われますが、これは非常に良いです〜
一番印象に残っているのはC++のリファレンスですが、1年生でC言語を学習する過程ではこのあたりの知識は全くありませんでした。
関連する知識ポイントは次のとおりです。
(1) 引用の概要
パラメータの転送は本質的に代入のプロセスであり、char、bool、int、float などの基本的なデータ型の場合、それらが占有するメモリは通常わずか数バイトであり、メモリのコピーは非常に高速です。
配列、構造体、オブジェクトは一連のデータの集合です。データの量に制限はなく、数個から数万個までです。これらを頻繁にメモリにコピーすると、時間がかかり、実行効率が低下する可能性があります。プログラムの。
C 言語では、この集合型データを渡すときはポインタを渡すことが推奨されます。しかし、ポインタは使いにくく、読みにくくなります。
したがって、C++ では、集合型データを転送するためのポインタ参照よりも便利な方法が追加されました。
ポインタと同様に、参照はデータのコピーを減らし、データ転送効率を向上させることができ、ポインタよりも便利で使いやすいです。
(2) 参考文献の文法形式
type &name = data;
例:
int a = 10;
int &p = a;
参照はデータのエイリアスとみなすことができ、データはこのエイリアスと元の名前を通じて検索でき、参照に対する操作はデータに対する操作と同等です。
(3) 引用規則
1. 参照は単なるエイリアスであり、メモリを占有せず、参照する変数と同じメモリ空間を共有します。
2. 参照は & でのみ定義され、& なしで通常の変数として使用されます。
3. 参照は、作成時に初期化する必要があります。参照が初期化されると、ポインタ定数と同様に、参照が指す変数を変更することはできません。
4. 参照は特定の正当なメモリ単位に関連付けられている必要があり、NULL 参照がないため使用できません。
(4) 参考にしたアプリケーション
4.1 共通の参考資料
参照空間のデータはエイリアスを通じて変更できず、変更されたパラメータにより関数内での参照空間の誤操作を防ぐことができます; 形式:
const
データ型 & エイリアス = データ空間名;
const データ型 & エイリアス
4.2 参照と配列
①配列要素の種類(&エイリアス) [要素数] = 配列名;
② typedef を使用して配列要素の型 [要素数] をエイリアスし、新しい型名を使用して参照を定義します
4.3 *参照はポインタに基づいて動作します
ポインタ変数のエイリアス。C 言語では二次ポインタを使用してポインタを指し、ポインタ空間で操作します。C++ ではポインタにエイリアスを付けてポインタ空間で操作できます。
4.4. 関数パラメータとしての参照
//参照
//関数の外部空間のデータを関数内で変更する
//パラメータのコピーを生成しない
//ポインタよりも使いやすい
注: 参照をパラメーターとして使用し、関数内の参照空間の内容を変更したくない場合は、参照の前に const 変更を追加できます。
4.5. 関数の戻り値としての参照 - 通常は反復に使用されます
注: ローカル変数への参照を返さないでください。関数が戻った後にローカル変数が破棄されるため、返された参照は「何もない」参照になり、プログラムは不明な状態になります。
(5) 引用の性質
参照の本質は C++ のポインタ定数 (定数ポインタ)、 typedef& ref = val; //typedef* const ref = &val; です。
参照はポインタの単なるカプセル化であり、その最下位層は依然としてポインタを通じて実装されています。参照によって占有されるメモリは、ポインタによって占有されるメモリ長と同じであり、32 ビット環境では 4 バイトです64 ビット環境では 8 バイト、参照のアドレスが取得できないのは、コンパイラが内部変換を行うためです。
要約: 変数 p がメモリを占有していないのではなく、コンパイラがそのアドレスの取得を許可していないのです。
(6) 参照とポインタの違い
1. 参照はポインタよりも便利で読みやすいです。
2. 参照はメモリを占有しませんが、ポインタはメモリを占有します。
3. 参照される値を NULL にすることはできず、ポインタの値も NULL にすることができます。
4. ポインタと参照の自己インクリメント(++)演算と自己デクリメント(--)演算の意味が異なります。次のデータを指すポインターには ++ を使用し、参照するデータに 1 を加算する参照には ++ を使用します。自己減分 (--) も同様です。
3. キーワードの側面
関連する教科書を調べたところ、
(1) C言語には32のキーワードがあります (2) C++には63のキーワードがあります
4. 接尾語について
先学期にデータ構造の実験をしていたとき、便宜上すでに C++ ファイルを使用していました
(1) C言語:.c
(2)C++:.cpp
5. constについて
C言語のconstで修飾される変数は、定数変数または読み取り専用変数と呼ばれ、定数ではありませんが、この定数変数を配列の添字として使用することはできません。ただし、C++ の const によって変更された変数は配列の添字として使用でき、実際の定数になります。これは C++ を const に拡張したものです。
C 言語の const: 変更すると左辺値として使用できなくなり、初期化もできませんが、後で再初期化する機会はありません。配列の添字として使用することはできませんが、ポインターを介して変更できます。簡単に言えば、通常の変数との違いは、左辺値にできないことです。他の場所も同じです。
C++ の const: 実定数。定義時に初期化する必要があり、配列の添字として使用できます。C++ における const のコンパイル規則は置換 (マクロと同様) であるため、実定数とみなされます。ポインタによって変更することもできます。C++ ポインタは C 言語ポインタに縮退する可能性があることに注意してください。
const がシンボルを生成する場合、それはローカル シンボルです。つまり、このドキュメント内でのみ表示されます。他のファイルで使用する必要がある場合は、ファイル ヘッダーで次のように宣言します: extern cosnt int data = 10; 生成されるシンボルはグローバル シンボルです。
概要: C の const は読み取り専用変数と呼ばれますが、左辺値変数にすることはできません。C++ の const は実定数ですが、C 言語の定数に縮退する可能性があり、ローカル シンボルがデフォルトで生成されます。
6. メモリ空間の申請と解放について
malloc() と free() は、C 言語で動的にメモリの適用とメモリの解放を行う標準ライブラリの関数です。new と delete は C++ の演算子とキーワードです。new と delete の最下層は、実際には malloc と free を呼び出します。それらは次の点で異なります。
1)、malloc と free は関数、new と delete は演算子です。
2)、malloc はメモリを割り当てる前にサイズを必要としますが、new は必要ありません。
malloc でサイズを指定する必要がある場合は、型変換も必要です。新規時のサイズは与えられた型から判断できるため指定する必要がなく、同時に初期値も代入できます。
3) Malloc は安全ではないため、手動で型変換する必要がありますが、new は型変換を必要としません。
詳しくは前回の記事をご覧ください。
4)、free はスペースを解放するだけで、delete は最初にデストラクターを呼び出してから、(必要な場合) スペースを解放します。
項目 5 に対応して、複合型が使用されている場合は、まず破棄してから、operator delete を呼び出してメモリを再利用します。
5)、新しい方法では、最初にコンストラクターを呼び出してから、(必要に応じて) スペースを適用します。
項目④に対応して、new を呼び出すとき (たとえば、int *p2 = new int; このコード)、基礎となるコードの実装は次のとおりです。最初に 4 バイト (int 型のサイズ) をプッシュし、次に演算子 new 関数割り当てを呼び出します。記憶がなくなった。私たちのコードには複合型 (クラス型など) が含まれていないため、コンストラクターの呼び出しはありません。
6) メモリ不足(開発失敗)の場合は処理方法が異なります。
malloc が失敗すると 0 が返され、new が失敗すると bad_alloc 例外がスローされます。
7)、new と malloc のオープン メモリの場所は異なります。
malloc はヒープ領域に割り当てられ、new は空き領域に割り当てられます。
8)、new は malloc() を呼び出すことができますが、malloc は new を呼び出すことができません。
new は malloc() で実装されていますが、new は C++ 独自のもので、当然 malloc を呼び出すことはできません。
要するに、違いの間には密接な関係があるのです
7. 新しいデータ型 bool
占有メモリは 1 バイトで、コンピュータが 0 以外の場合は確立、0 のみまたはポインタが空の場合は確立されていないことを示し、一般的には、コンピュータの戻り値として使用されます。関数、またはスイッチの通常の出力は 0 と 1 です。C++ 独自の割り当てメソッド、false と true
8. 関数思考、関数オーバーロード...
学びはまだ終わっていません、共有は続きます~