-2

= 演算子をオーバーロードして文字列をコピーしようとしています。

class cString
{
 int len;
 char *mbuff;
};


int main()
{
cString s1,s2;
s1 = s2;
//here s1 goes out of scope and its destructor called
cout<<" hello";
......
......
......
return 0;
}

cString& cString::operator=(const cString &s)
{
if(this->mbuff!=NULL)
   delete[] (this->mbuff);

this->len = s.len;
this->mbuff = new char[this->len+1];
strcpy(this->mbuff,s.mbuff);
return *this;
}

s1=s2 はs1.operator=(s2) として扱われます。

operator=関数では、s1 が暗黙的に渡されます。s1 は main のブロックで作成されるため、s1 のデストラクタは最後に呼び出す必要があります。つまり、メインを終了する直前。

しかし、戻り値の型をcString&(reference)と書くと、関数から main に戻った直後にs1 のデストラクタが呼び出されます。ただし、戻り値の型がvoidの場合、s1 のデストラクタはすぐには呼び出されません。main..を終了するときに通常どおり呼び出します。

参照を返すとオブジェクトs1が範囲外になるのはなぜですか? return *this の正確な意味は何ですか?

参照を返す必要がないことはわかっています。void 戻り値の型でコードを正常に実行しました。どうなるのか気になるところです…!

ありがとう...!

4

3 に答える 3

1

私のサイキックなデバッグ スキルs1は、あなたが考えている範囲からは外れていないことを教えてくれます。範囲外になるのは、ほとんどの場合、コンパイラが、あなたが示していないコードの一部であなたに代わって作成した一時的なオブジェクトです。

余談ですが、mainneverの有効なシグネチャにvoidは戻り値の型として含まれています。

于 2013-05-28T16:59:17.580 に答える
0

ソースを以下と比較してください。これでうまくいくはずです

#include "stdafx.h"
#include <iostream>

class cString
{
    public:
    ~cString()
    {
        std::cout << "destructor" << std::endl;
    }

    cString& str_copy(const cString &s)
    {
        return *this;
    }
};

int main(int argc, char * argv[])
{
    cString s1,s2;
    s1.str_copy(s2);

    //here s1 should not go out of scope and its destructor called
    std::cout << "hello" << std::endl;

    return 0;
}

出力:

C:\AAA\blah\Debug>blah.exe
hello
destructor
destructor
于 2013-05-28T17:02:09.033 に答える