"&安培;"转换运营商的影响力

时间:2014-08-11 17:51:26

标签: c++

我在命名空间MySpace中有自定义字符串。

namespace MySpace
{

const std::string bws = "hello";

    class string
        {
    public:
        std::string s ;
        string(void) :s(bws) {}
        string(const std::string & _s ) : s(bws) {};
        operator std::string & (void) {return s;}
        };

}

“&”会产生什么影响在转换为std:string operator?

operator std::string & (void) {return s;}

operator std::string  (void) {return s;}

在此代码中的行为相同:

MySpace::string f("ddd");
std::string d=f;
std::cout<<d<<std::endl;

他们都将"hello"分配给d

2 个答案:

答案 0 :(得分:3)

区别在于

operator std::string  (void) {return s;}

返回s的副本,而

operator std::string & (void) {return s;}

返回对它的引用。

因此,如果您在第一种情况下修改返回值,则不会影响类变量s的值,但在第二种情况下会这样做。

通常,通过非const引用返回类变量被认为是一种危险的做法。

答案 1 :(得分:0)

使用&,会返回对s的引用。否则,将创建并返回s的副本。

这在您的示例中没有任何区别,因为返回的引用用于在d仍处于活动状态时初始化s,但在实际代码中可能会变得很重要。要记住的一个特殊问题是,如果您在重构过程中不注意可能会在以后发生,则返回引用可能会导致悬空引用。例如:

operator std::string & (void) { std::string result = "x" + s; return result; } // dangerous!

我猜运算符重载只会增加混乱。想象一下要声明的函数std::string & ToString(),一切都应该变得更加清晰。