-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) s1 的析构函数在从函数返回到 main 后立即被调用。但如果返回类型为void,它不会立即调用 s1 的析构函数。它在退出主程序时正常调用..

为什么当我返回引用时对象s1超出范围?return *this 的确切含义是什么?

我知道没有必要返回参考。我已经使用 void 返回类型成功执行了我的代码。我只是好奇会发生什么……!

谢谢...!

4

3 回答 3

1

我的心理调试技能告诉我,s1当你认为它超出范围时,它并没有超出范围。超出范围的内容几乎可以肯定是编译器在您未向我们展示的代码的某些部分帮助您创建的临时对象。

main顺便说一句,从不包含的有效签名void作为返回类型。

于 2013-05-28T16:59:17.580 回答
1

你的例子不正确。同时具有 s1 和 s2 的范围是 main() [应该是 int main()],因此它们在 main 结束时超出范围,此时调用 dtor。

str_copy 的可见部分不会创建或销毁对象,因此那里没有 dtor 调用。但是,如果它在没有引用的情况下返回 cString,则该临时 cString 将在标记点被销毁,并且您会看到一个 dtor 调用——当然不是针对 s1,而是它的副本。

您可能在未显示的代码部分中遇到问题。


对于编辑后的版本:您的 op= 有很多问题,包括与异常安全和自分配有关的问题。我建议使用现有的绳子,而不是自己雕刻破损的绳子,耗费时间和精力。并且至少阅读 Scott Meyers 的 Effective C++,其中包含有关这些运算符的项目。

于 2013-05-28T16:59:49.967 回答
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 回答