C++_関数のリロードと参照

2420 ワード

関数の再ロード
C言語では、関数は1つの関数名を繰り返すことはできませんが、C++は、同じ役割ドメインでいくつかの機能が類似していることを宣言できる同名の関数であり、これらの同名の関数のパラメータリスト(パラメータの個数、タイプ、順序)は異なる必要があります.
#include 

int	Add(int a, int b)
{
	return a + b;
}

double Add(double a, double b)
{
	return a + b;
}

long Add(long a, long b)
{
	return a + b;
}

int main()
{
	Add(10, 30);
	Add(10.0, 30.0);
	Add(10L, 30L);
	return 0;
}

では、C言語ではなぜ関数のリロードが実現できないのでしょうか.
CとC++環境ではint Add(int a,int b)という関数が作成され、C++で生成される関数名は下図のように、コンパイラが関数が存在する役割ドメイン内の同じ関数名の関数を関数パラメータのタイプや順序に応じて名前を変更するため、各関数数は名前が同じように見えますが、実際には違いがあります.しかし、C言語では、コードがコンパイルされると、コンパイラは名前を変更せず、簡単に関数の名前を変更するだけで、Cが関数の再ロードを実現できない理由です.
Add(10, 30);
002B53AE  push        1Eh  
002B53B0  push        0Ah  
002B53B2  call        Add (02B1118h)  
002B53B7  add         esp,8  
	Add(10.0, 30.0);
002B53BA  sub         esp,8  
002B53BD  movsd       xmm0,mmword ptr ds:[2BCD90h]  
002B53C5  movsd       mmword ptr [esp],xmm0  
002B53CA  sub         esp,8  
002B53CD  movsd       xmm0,mmword ptr ds:[2BCD80h]  
002B53D5  movsd       mmword ptr [esp],xmm0  
002B53DA  call        Add (02B1014h)  
002B53DF  fstp        st(0)  
002B53E1  add         esp,10h  
	Add(10L, 30L);
002B53E4  push        1Eh  
002B53E6  push        0Ah  
002B53E8  call        Add (02B101Eh)  
002B53ED  add         esp,8  

参照
リファレンスは新しく定義された変数ではなく、既存の変数に別名を付けます.コンパイラはリファレンス変数にメモリ領域を開くことはありません.リファレンス変数と共通のメモリ領域です.タイプ&参照変数名(オブジェクト名)=参照エンティティですが、タイプは参照エンティティのタイプと同じでなければなりません.
参照プロパティ
リファレンスは定義時に初期化する必要があります.
同時に、エンティティが参照されると、他のエンティティは参照できません.
1つの変数には複数の参照があります.
シーンの操作
関数としてのパラメータ
void Add(int& a, int& b)
{
  return a + b;
}

関数としての戻り値
int & TestRefReturn(int& a)
{
  a += 10;
  return a;
}

参照とポインタの違い
同じ点:
リファレンスとポインタは、最下位の実装ではポインタに従って実装されます.
相違点:
参照は使用時に初期化しなければならないが、ポインタは初期化を要求していない.
1つの参照が初期化されて1つのオブジェクトを指すことは、他のオブジェクトを指すことはできませんが、ポインタはいつでもオブジェクトを変えることができます.
参照は空(NULL)参照ですが、空(NULL)ポインタがあります.
参照sizeof()関数は、結果が参照タイプのサイズですが、ポインタの結果はアドレス*空間が占めるバイトの数です.
自己加算変数の内容を参照し、ポインタは自己加算でポインタの方向を変更する.
マルチレベルポインタはありますが、マルチレベル参照はありません.        
ポインタは手動でアドレスする必要がありますが、参照はコンパイラによってアドレスを実現します.
参照はポインタよりも安全です.
リファレンスはポインタよりも安全なのはなぜですか?
ポインタを呼び出すと、ポインタは空ではありませんが、そのポインタが指す内容が削除され、システムがクラッシュする可能性がありますが、参照はできません.参照は空ではありません.したがって、参照はより安全です.