C++运算符重载需要注意的地方
作者:网络转载 发布时间:[ 2012/8/29 10:45:52 ] 推荐标签:
有时候自己写一个类,需要重载运算符,但对于一些操作符(如==、<、>等),可以在类里写,也可以在类外写。那么 C++ 编译器会去怎么调用呢?
首先,我们知道,“重载” 机制可以允许多个函数有相同的函数名,但参数列表必须不同。C++编译器经过名字改编(name mangling),可以在调用时依据所传实参找到“符合”的函数实体进行调用。而运算符重载亦是如此。
首先,我们有一个类:
class CMyCls
{
public:
bool operator == (const CMyCls& rhs); // 1.
bool operator == (const CMyCls& rhs) const; // 2.
bool operator == (CMyCls& rhs); // 3.
bool operator == (CMyCls& rhs) const; // 4.
};
void f1 (CMyCls& lhs, const CMyCls& rhs);
{
lhs == rhs;
}
void f2 (const CMyCls& lhs, const CMyCls& rhs);
{
lhs == rhs;
}
void f3 (CMyCls& lhs, CMyCls& rhs);
{
lhs == rhs;
}
void f4 (const CMyCls& lhs, CMyCls& rhs)
{
lhs == rhs;
}
那么 f1 - f4 这四个函数将会如何调用呢?其实,f1函数会调到CMyCls类中1 处注释所标的函数,f2会调到 2 处注释所标的函数,f3、f4依次类推。
那么,如果我在类里面有一个运算符重载,在类外也有,会调用哪一个呢?比如:
class CMyCls
{
public:
bool operator == (const CMyCls& rhs) const
{
// ...
}
};
bool operator == (const CMyCls& lhs, const CMyCls& rhs)
{
// ...
}
void f(const CMyCls& lhs, const CMyCls& rhs)
{
lhs == rhs;
}
但很不幸的是,这样编不过。因为对于 f 函数的调用来说,编译器不知道调哪一个会比较好,因为同时存在两份“适合”的重载函数,所以产生歧义。但这样是可以编过的,思考下为什么:
class CMyCls
{
public:
bool operator == (const CMyCls& rhs)
{
// ...
}
};
bool operator == (const CMyCls& lhs, const CMyCls& rhs)
{
// ...
}
void f1(const CMyCls& lhs, const CMyCls& rhs)
{
lhs == rhs;
}
void f2(CMyCls& lhs, const CMyCls& rhs)
{
lhs == rhs;
}
上面 f1会调到全局的函数operator ==,而f2会调到 CMyCls的成员函数operator ==。所以,好的写法是只在类里或类外重载两个参数均为const的版本。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11