我在命名空间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
。
答案 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()
,一切都应该变得更加清晰。