ポインターを使用すると、パラメーターを渡す方法が値による受け渡しに限定されなくなりました。カスタム変数が大きな領域を占有する場合、値渡しの効率が非常に低くなりますが、ポインタを使用するとアドレスを 1 つだけ渡すのと同じになり、パラメータの受け渡しの効率が大幅に向上します。
参照はポインターに似ており、ポインターと同じ効果を達成でき、パラメーター受け渡しの効率を向上させることができます。ポインターがあるのに、なぜ参照が必要なのでしょうか。理由分析は次のとおりです。
- 引用符はもともと演算子のオーバーロードをサポートするために提案されました。
- 参照が初期化されるときに初期値をバインドする必要があり、変更することはできません。これにより、参照が指すアドレスが有効であることが保証されます (ワイルド ポインターやポインターが空になるような状況は発生しません)。
目次
2. ポイントしているアドレスが有効であることを確認します。
1. 演算子のオーバーロードをサポート
1. 参考文献を使用しない
構造体 person があるとします。演算子 > をオーバーロードして 2 人の年齢を比較したいとします。参照がない場合、演算子のオーバーロードを実現するには、次のようにするしかありません。
struct Person
{
int age;
char name[10];
bool operator >(Person* p1) // 使用指针
{
return this->age > p1->age;
}
};
使用すると非常に奇妙に見えます。まさに 2 つのオブジェクトのアドレス サイズを比較するようなものです。今回の場合は曖昧な点があり、それを避けるために上司が見積書を提案しました。
struct Person p1 = {10, "张三"};
struct Person p2 = {11, "张三"};
&p1 > &p2 // 比较地址? 还是比较年龄?
2. リファレンスを使用した後
上記のケースに基づいて修正し、次のように引用符に変更します。
struct Person
{
int age;
char name[10];
bool operator >(Person& p1) // 使用引用
{
return this->age > p1.age;
}
};
これで、使用に曖昧さはなくなり、使用方法は組み込み型とまったく同じになります。
struct Person p1 = {10, "张三"};
struct Person p2 = {11, "张三"};
p1 > p2 // 比较年龄大小
&p1 > &p2 // 比较地址大小
2. ポイントしているアドレスが有効であることを確認します。
ポインタを使用すると、NULL ポインタやメモリ リークなどの問題が発生したり、ポインタが指すアドレスを誤って変更してしまう可能性があります。
// 野指针
int* pa;
*pa = 10;
// 内存泄漏(不主动释放)
int* pb = new int;
参照を使用する場合は、これらについて心配する必要はありません。参照を宣言するときは、初期値をバインドする必要があり、変更することはできません。これにより、ワイルド ポインタと同様に、ポインタ アドレスを誤って変更する問題が回避されます。
int pb = 10;
int& pc = pb;