运算符重载中的显式构造?
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&
绑定到临时)。
【讨论】:
【参考方案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++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)
python0.16------构造函数/析构函数/self详解/重写/访问限制/对象属性和类属性/@property/运算符重载