运算符重载中的显式构造?

Posted

技术标签:

【中文标题】运算符重载中的显式构造?【英文标题】:In-explicit constructing in operator overloading? 【发布时间】:2011-10-13 14:06:54 【问题描述】:

是否可以使用带运算符的显式构造? 就像在这个例子中一样(当然不起作用):

class myFoo 
    public:
        double x, y;

        myFoo(double, double);

        void    operator [] (myFoo);
;

int main() 
    myFoo f1(0.0, 1.1);
    f1[ 9.9, 10.0 ];          /// or whatever syntax to use, does not work
    f1.operator[] ( 9.9, 10.0 ); /// works !

【问题讨论】:

【参考方案1】:

C++11 允许将初始化列表传递给重载的operator [](参见 13.5.5)。

你需要类似的东西

void operator[](std::initializer_list<double>);

这将匹配您的 f1[ 9.9, 10.0 ]; 的原始语法。

【讨论】:

但是 f1.operator[] ( 9.9, 10.0 ); 没有初始化列表也能工作? 好点。我不知道为什么会有差异。这可能取决于“有效”的含义以及正在使用的编译器。【参考方案2】:

嗯...

f1[myFoo(9.9, 10.0)];?

需要一个合理的operator[](即期望const myFoo&amp;绑定到临时)。

【讨论】:

【参考方案3】:

不,在当前 C++03 或即将推出的 C++11 标准中使用 operator [] 是不可能的。但是,您可以使用一些奇怪的语法来利用 operator [] 来实现相同的目的:

f1[myFoo(9.9,10.0)];

operator [] 在哪里,

myFoo& operator [] (const myFoo&);

【讨论】:

【参考方案4】:

是的,它确实适用于当前代码。无论您使用 '[]' 的实现可能是什么(我所做的只是返回类内数组中索引处的值。因此该类现在可以用作数组类型)操作符所有需要完成的事情确保您传入一个 const 引用并且不进行任何更改。

int main() 
    myFoo f1(0.0, 1.1);
    f1[f1];      /// or whatever syntax to use

会起作用的。

【讨论】:

f1[ 9.9, 10.0 ]; 他似乎想传递一个初始化列表【参考方案5】:

您的代码在 C++11(g++ 版本 4.5.2)中运行良好。你只需要说

f1[myFoo 9.9, 10.0 ];

而不是

f1[ 9.9, 10.0 ];

【讨论】:

以上是关于运算符重载中的显式构造?的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象中

C ++中的复制构造函数和=运算符重载:通用函数可能吗?

复制构造函数和重载的加法运算符

c++中的顺序表写法,主要实现(增删查改,构造函数,运算符重载)

c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)

python0.16------构造函数/析构函数/self详解/重写/访问限制/对象属性和类属性/@property/运算符重载