当前位置:  开发笔记 > 编程语言 > 正文

为什么你不能超载'.' C++中的运算符?

如何解决《为什么你不能超载'.'C++中的运算符?》经验,为你挑选了3个好方法。

能够超载它是非常有用的.C++中的operator并返回对象的引用.

你可以超载operator->,operator*但不能operator.

这有技术原因吗?



1> Anton Gogole..:

请参阅Bjarne Stroustrup的这句话:

运营商.(dot)原则上可以使用与 - >相同的技术重载.但是,这样做会导致对操作是否意味着对象重载的问题.或者提到的对象.例如:

class Y {
public:
    void f();
    // ...
};

class X {    // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};

void g(X& x)
{
    x.f();    // X::f or Y::f or error?
}

这个问题可以通过几种方式解决.在标准化的时候,哪种方式最好是不明显的.有关更多详细信息,请参阅C++的设计和演变.


我很想把这个投票给抄袭/重新加载.引用时,请逐字引用,不要调整.并使用报价格式.
这个例子只是过载分辨率模糊,指出需要更仔细的编程(参见:http://stackoverflow.com/questions/13554606/ambiguity-not-picked-up-by-compiler)这种情况不应该作为一个没有超载`operator``的原因

2> ddaa..:

Stroustrup说C++应该是一种可扩展但不可变的语言.

点(属性访问)运算符被认为太靠近语言的核心以允许重载.

请参阅C++的设计和演变,第242页,第11.5.2节" 智能参考".

当我决定允许运算符重载时->,我自然会考虑运算符.是否同样过载.

当时,我认为以下论点是决定性的:如果obj是一个类对象,则该对象的obj.m每个成员都有一个含义m.我们尽量不通过重新定义内置操作来使语言变得可变(尽管=出于迫切需要而违反了该规则,并且对于一元而言&).

如果我们允许.一个班级超载X,我们将无法X通过正常方式访问成员; 我们必须使用指针->,但->&可能已经重新定义.我想要一种可扩展的语言,而不是一种可变语言.

这些论点很重要,但不是决定性的.特别是,1990年,吉姆·阿德科克(Jim Adcock)提议允许操作员. 完全按照操作员的方式进行超载->.

这句话中的"我"是Bjarne Stroustrup.你不能比那更具权威性.

如果你想真正理解C++(就像"为什么会这样"),你绝对应该阅读这本书.



3> mfazekas..:

Stroustrup 对这个问题有一个答案:

运营商.(dot)原则上可以使用与 - >相同的技术重载.但是,这样做会导致对操作是否意味着对象重载的问题.或者提到的对象.例如:

class Y {
public:
    void f();
    // ...
};
class X {   // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};
void g(X& x)
{
    x.f();  // X::f or Y::f or error?
}

这个问题可以通过几种方式解决.在标准化的时候,哪种方式最好是不明显的.有关详细信息,请参阅D&E.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有