私は Java から C++ に移行しており、言語の柔軟性について少し混乱しています。1 つのポイントは、オブジェクトを格納する方法が 3 つあることです。ポインター、参照、およびスカラーです (正しく理解すれば、オブジェクト自体を格納します)。
私は可能な限り参照を使用する傾向があります。これは、可能な限り Java に近いためです。場合によっては、派生属性のゲッターなど、これは不可能です。
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
t
のスコープ内にのみ存在するため、これはコンパイルされませんgetSomeAttribute()
。参照を返すと、クライアントが使用できるようになる前にどこにもポイントしません。
したがって、次の 2 つのオプションが残っています。
- ポインターを返す
- スカラーを返す
ポインターを返すと、次のようになります。
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
これは機能しますが、クライアントはNULL
、参照では必要のないことを確認するために、このポインターをチェックする必要があります。もう 1 つの問題は、呼び出し元t
が割り当てが解除されていることを確認する必要があることです。回避できる場合は、それを処理したくありません。
別の方法は、オブジェクト自体 (スカラー) を返すことです。
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
それは非常に簡単で、この場合に私が望んでいることです。参照のように感じ、null にすることはできません。オブジェクトがクライアントのコードの範囲外にある場合、オブジェクトは削除されます。とても便利です。しかし、そうしている人をほとんど見かけませんが、それには何か理由があるのでしょうか? ポインターや参照の代わりにスカラーを返す場合、何らかのパフォーマンス上の問題はありますか?
この問題を処理するための最も一般的/エレガントなアプローチは何ですか?