C++学習ノートday 41-----C++98-参照関数パラメータでの使用、C++でのタイプ変換、C++プログラミング習慣の推奨、クラスとオブジェクト、クラスの定義とインスタンス

3492 ワード

参照設計により,関数間でパラメータを伝達する際に効率が向上する.参照自体にエンティティがないため、参照されたバインドされたターゲットと同じメモリが使用されるため、関数は大きなデータの実パラメータを渡すときに余分なスペースを必要としません.時間も空間も節約しました.左の値->通常の変数->代入式の戻り値=+=-=...->前の++、–右の値->定数、フォント値->ほとんどの式の結果、後の++、-->を含む**関数の戻り値(一時変数/死の右の値)3は、関数のパラメータ1を参照するために使用できます.この場合、パラメータは実パラメータの別名です.実パラメータ変数の値は、パラメータによって直接変更できます.また,パラメータ値の伝達を回避し,関数呼び出しのオーバーヘッドを低減し,コード実行効率を向上させることも可能である2)参照型のパラメータは意外にも実パラメータを修正する可能性があり,実パラメータ自体を修正したくない場合は,形パラメータを常参照として定義することができ,パラメータ伝達効率を向上させるとともに定数型の実パラメータを受け入れることも可能である.
4参照パラメータ戻り値1)関数の戻り値を参照として宣言し、戻り値によるメモリオーバーヘッドを回避できます2)関数戻り値タイプが参照の場合、関数戻り値は左のint&func(void){static int a=100;return a;}func() = 100;//OK注意:関数からローカル変数の参照を返さないでください.参照されたターゲットは関数が返された後に回収されるので、使用は危険です.ただし、メンバー変数、静的変数、グローバル変数を返すことができます.
1)Cから見たリファレンス実装の本質はポインタであるが,C++開発ではポインタではなくリファレンスを多く使用することを提案する.int num = 100; int &rnum = num; int*const pnum=#rnum<=等価=>*pnum;2)ポインタは初期化しなくてもよく、ポインタ定数を除いてターゲットを指して修正することができ、参照は初期化しなければならない.また、参照を初期化したターゲットは変更できない.eg: int a = 10,b = 20; int *p_num; p_num = &a; p_num = &b; //int &r_num;//error int &r_num = a; r_num = b;//参照先を変更するのではなく、値を割り当てます.
3)ポインタのポインタ(二次ポインタ)は定義できますが、参照ポインタeg:int a=100は定義できません.int *p_a = &a; int **pp_a = &p_a;
int &r_a = a;
int &*p_r_a = &r_a;//error
int *p_r_a = &r_a;//success,     

4)ポインタの参照(ポインタ変数に別名を付ける)は定義できますが、参照の参照int a=100は定義できません.int *p = &a; int *&r_p = p;//ok
int &r_a = a;
int &&rr_a = r_a;//error
int &rr_a = r_a;//ok,    

5)ポインタ配列は定義できますが、参照配列eg:int a=1,b=2,c=3は定義できません.int *parr[3] = {&a,&b,&c};//ok int &rarr[3] = {a,b,c};//error 6)配列参照int arr[3]={1,2,3}を定義する.int (&rarr)[3] = arr;//OK 7)は、関数ポインタと同様に、関数参照を定義することもできます.構文の使用と関数ポインタの類似:eg:void func(int a,double d){...}int main(void){void(*pf)=func;//関数ポインタpf(10,3.14);void(&rf)(int,double)=func;//関数参照rf(10,3.14);}
十一、タイプ変換1暗黙タイプ変換eg:char c=‘a’;int i = c;//暗黙的———————void foo(int i){...}foo(c);//暗黙的――――――int bar(void){char c=‘a’;return c;}―――――――――
2明示型変換2.1 C++互換Cにおける強制変換char c=‘a’;int i = (int)c;//明示的、Cスタイルint i=int(c);//C++スタイル2.2 C++は4つの操作付形式の明示的な変換を追加した1)静的タイプ変換構文:ターゲットタイプ変数=static_cast(元のタイプの変数)シーンの使用:void*を別のタイプのポインタに変換するには
2)ダイナミックタイプ変換ターゲットタイプ変数=dynamic_cast(元のタイプ変数)
3)定型変換目標型変数=const_cast(元のタイプの変数)適用シーン:ポインタまたは参照を除去するための通常属性const_cast.cpp
4)型変換構文の再解釈:ターゲット型変数=reinterpret_cast(元のタイプの変数)適用シーン:->任意のタイプのポインタまたは参照間の変換->ポインタと整数の間でegを直接変換する:物理メモリ0 x 12345678アドレスにデータ100を格納する;int paddr = reinterpret_cast< Int >(0x12345678); *paddr = 100;
小結:C++の父からC言語プログラマーへのアドバイス1、マクロを慎み、const、enum、inlineで#define PAI 3.14 const double PAI=3.14を置き換える.enum status{SLEEP,RUN,STOP};
#\define max(a,b) ((a)>(b)?(a):(b))
inline int max(int a,int b){ return a > b ? a : b; } 2、変数は宣言に従って同時に初期化する3、できるだけnew/deleteを使ってCの中のmalloc/free 4、void*、ポインタ計算、連合体、強制変換5、できるだけstringを使って文字列を表し、Cスタイルchar*/char[]を少なく使う
十二、類と対象1、何が対象であるか万物はすべて対象であり、どんなものも対象と見なすことができる.
2、どのようにオブジェクトを記述し、表現するかは、オブジェクトの属性(名詞、数量語、形容詞)と行為(動詞)によってオブジェクトを記述する.
3、オブジェクト向けのプログラミング自然世界におけるオブジェクトの記述をプログラミング実践の理念と方法に導入し、この方法は「データ抽象」となり、オブジェクトを記述する際、細部のものは離れ、一般性(共通性)、規則性、統一性の面だけを考慮する.
4、クラスクラスとは、複数のオブジェクトの共通性を抽出して定義されたものであり、新しいデータ型は、オブジェクトの属性と動作の抽象的な説明である.
十三、クラスの定義とインスタンス化1、クラスを定義する文法一般形式class/structクラス名:継承方式ベースクラス…{アクセス制御変数子:クラス名(パラメータテーブル):初期化テーブル{//関数体}//コンストラクション関数~クラス名(void){関数体}//コンストラクション関数戻りタイプ関数名(パラメータテーブル){関数体}//メンバー関数データ型変数名;//メンバー変数};