C++_関数のリロードと参照
2420 ワード
関数の再ロード
C言語では、関数は1つの関数名を繰り返すことはできませんが、C++は、同じ役割ドメインでいくつかの機能が類似していることを宣言できる同名の関数であり、これらの同名の関数のパラメータリスト(パラメータの個数、タイプ、順序)は異なる必要があります.
では、C言語ではなぜ関数のリロードが実現できないのでしょうか.
CとC++環境ではint Add(int a,int b)という関数が作成され、C++で生成される関数名は下図のように、コンパイラが関数が存在する役割ドメイン内の同じ関数名の関数を関数パラメータのタイプや順序に応じて名前を変更するため、各関数数は名前が同じように見えますが、実際には違いがあります.しかし、C言語では、コードがコンパイルされると、コンパイラは名前を変更せず、簡単に関数の名前を変更するだけで、Cが関数の再ロードを実現できない理由です.
参照
リファレンスは新しく定義された変数ではなく、既存の変数に別名を付けます.コンパイラはリファレンス変数にメモリ領域を開くことはありません.リファレンス変数と共通のメモリ領域です.タイプ&参照変数名(オブジェクト名)=参照エンティティですが、タイプは参照エンティティのタイプと同じでなければなりません.
参照プロパティ
リファレンスは定義時に初期化する必要があります.
同時に、エンティティが参照されると、他のエンティティは参照できません.
1つの変数には複数の参照があります.
シーンの操作
関数としてのパラメータ
関数としての戻り値
参照とポインタの違い
同じ点:
リファレンスとポインタは、最下位の実装ではポインタに従って実装されます.
相違点:
参照は使用時に初期化しなければならないが、ポインタは初期化を要求していない.
1つの参照が初期化されて1つのオブジェクトを指すことは、他のオブジェクトを指すことはできませんが、ポインタはいつでもオブジェクトを変えることができます.
参照は空(NULL)参照ですが、空(NULL)ポインタがあります.
参照sizeof()関数は、結果が参照タイプのサイズですが、ポインタの結果はアドレス*空間が占めるバイトの数です.
自己加算変数の内容を参照し、ポインタは自己加算でポインタの方向を変更する.
マルチレベルポインタはありますが、マルチレベル参照はありません.
ポインタは手動でアドレスする必要がありますが、参照はコンパイラによってアドレスを実現します.
参照はポインタよりも安全です.
リファレンスはポインタよりも安全なのはなぜですか?
ポインタを呼び出すと、ポインタは空ではありませんが、そのポインタが指す内容が削除され、システムがクラッシュする可能性がありますが、参照はできません.参照は空ではありません.したがって、参照はより安全です.
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()関数は、結果が参照タイプのサイズですが、ポインタの結果はアドレス*空間が占めるバイトの数です.
自己加算変数の内容を参照し、ポインタは自己加算でポインタの方向を変更する.
マルチレベルポインタはありますが、マルチレベル参照はありません.
ポインタは手動でアドレスする必要がありますが、参照はコンパイラによってアドレスを実現します.
参照はポインタよりも安全です.
リファレンスはポインタよりも安全なのはなぜですか?
ポインタを呼び出すと、ポインタは空ではありませんが、そのポインタが指す内容が削除され、システムがクラッシュする可能性がありますが、参照はできません.参照は空ではありません.したがって、参照はより安全です.