0

名前空間内からオブジェクトを返すことは安全ですか? 以下のコードcall()では、bag オブジェクトを値で返しています。しかし、新しく作成されたオブジェクトのスコープは名前空間内にあります...そのため、それが正しい方法であるかどうか疑問がありました。

namespace abc{

class bag{

    public:
        bag()
        {
            cout<<"\nconstructor called";
        }
        ~bag()
        {
            cout<<"\ndestructor called";
        }
        bag(bag &c)
        {
            cout<<"\ncopy constructor called";
        }
        bag call()
        {
            bag f;
            return f;
        }
};

2 番目の質問は、コピー コンストラクターに関するものです。次main()の式を使用してコピーコンストラクターを呼び出そうとしていますが、コンパイラーがエラーをスローしています...どうすればこれを達成できますか

abc::bag b;
abc::bag c=b.call(); // trying to call copy constructor ,but getting compile time error
4

3 に答える 3

4

ある名前空間に属するクラスのメンバ関数からオブジェクトを返すことには何の危険もありません。あなたが言及している可能性のある問題がわかりません。

2 番目の問題については、次の式が原因です。

b.call()

右辺値 (一時オブジェクト) を生成し、コピー コンストラクターは左辺値参照を受け入れます。

bag(bag& c)

左辺値参照は右辺値にバインドできないため、コンパイラはあなたに怒鳴っています。コピー コンストラクターに正規の署名を持たせ、const代わりに左辺値参照を受け入れる必要があります (左辺値参照は右辺値にconstバインドできます)。

bag(bag const& c)
//      ^^^^^

結局のところ、通常、コピーを作成するオブジェクトを変更する必要はありません。

于 2013-06-25T17:33:25.870 に答える
2

名前空間は、名前を解決するために使用されるものにすぎません。オブジェクトの寿命などには影響しません。したがって、コードが名前空間のすぐ外側にある場合は、内側で問題ありません。

constそして、copy ctor (および op= の欠落) 署名で適切に使用する必要があります。

于 2013-06-25T17:35:00.677 に答える
0

abc::bag c=b.call();これは、コピー コンストラクターとは関係ありません。実装したコピーコンストラクターを呼び出すには、次のように書く必要がありますabc::bag c( &b )

于 2013-06-25T19:11:40.883 に答える