1

これまでに質問されたことがある場合はご容赦ください。確かにそうですが、満足のいく答えが見つかりませんでした。

私は重いJavaのバックグラウンドからcppに来ており、コピーではなくオブジェクトへの参照/ポインターをいつ返すかを理解したいと思います。

次のクラス定義の場合:

class SpaceShip {
    string name;
    WeaponSystem weaponSystem; //represents some object, this is just an example, I dont have this type of object at all in my program 
    int hull;

    string GetName() const {
       return name;
    }

    WeaponSystem GetWeaponSystem() const {
       return weaponSystem;
    }

    int GetHull() const {
       return hull;
    }
};

物事のコピーを返すのは費用がかかることを知っています。これは、文字列やweaponSystemのようなものを値で返すのは避けたいという意味だと思いますが、intを値で返すのは問題ありません。

これは正しいですか?また、メモリ内のどこに物事が存在するかを認識する必要があることも知っています。このクラスの何かへの参照を返すことは、このオブジェクトが破壊され、何かがその名前への参照をまだ所有している場合、将来的に危険を意味しますか?

4

3 に答える 3

0

それは「機能する」が、あなたは持っているべきです

const string& GetName() const {

次のものもあると有益かもしれません

const WeaponSystem& GetWeaponSystem() const {

また、classデフォルトではプライベートであるため、アクセサ関数はプライベートです。

于 2012-04-08T20:30:39.103 に答える
0

最後のポイントとして、Java よりも C++ でのリソース管理には、より注意を払う必要があります。特に、オブジェクトがいつ不要になるかを判断する必要があります。参照による戻りに​​は、返されたオブジェクトへのエイリアシングの効果があります。共有しているオブジェクトが不変の場合は目立ちませんが、Java の文字列とは異なり、C++ 文字列は変更可能です。したがって、name値で戻って の名前を変更すると、名前を変更しSpaceShipた後でも、呼び出し元には古い名前が表示されます。ただし、参照によって戻る場合は、ShaceShip名前が変更されるとすぐに呼び出し元に変更が表示されます。

複雑なオブジェクトのコピーを処理する場合、コピー コンストラクターのカスタム実装を提供することで、コピーする量を決定できます。コピー コンストラクターを提供する場合は、3 つのルールを忘れずに、残りの 2 つをオーバーライドしてください。

于 2012-04-08T20:39:09.153 に答える