C++运算符重载的问题
C++在重载运算符的时候什么要用const
今天遇到个例子。
- C/C++ code
class unit{public: void set_v1(int v); void set_v2(int v); int get_v1(); int get_v2(); unit():v1(0),v2(0){} friend ostream& operator <<(ostream& out,unit& unit); bool operator <(const unit& u) const;private: int v1; int v2;};这里bool operator <(const unit& u) const没有报错,我之前是写成bool operator <(unit& u) ;报错。后来进去看了下是要const修饰,我想问下。重载什么运算符需要用到const?
还有个问题见代码:
- C/C++ code
#include <iostream>#include <cstdio>#include <cstdlib>#include <utility>#include <algorithm>#include <vector>#include <functional>/*http://blog.pfan.cn/wfxsky/28836.html当你的容器中元素时一些标准类型(int float char)或者string时,你可以直接使用这些函数模板。但如果你时自己定义的类型或者你需要按照其他方式排序,你可以有两种方法来达到效果:一种是自己写比较函数。另一种是重载类型的'<'操作赋。bool operator <(const unit& u) const;must overload as const*/using namespace std;class unit{public: void set_v1(int v); void set_v2(int v); int get_v1(); int get_v2(); unit():v1(0),v2(0){} friend ostream& operator <<(ostream& out,unit& unit); bool operator <(const unit& u) const;//重载<作为比较算子private: int v1; int v2;};void unit:: set_v1(int v){ v1 = v;}void unit:: set_v2(int v){ v2 = v;}int unit::get_v1(){ return v1;}int unit::get_v2(){ return v2;}bool unit:: operator<(const unit &u1) const{ return (v1<u1.v1);}ostream& operator <<(ostream& out,unit& unit){ out<<unit.v1<<" "<<unit.v2<<endl; return out;}bool less_compare(const unit& u1, const unit& u2){ return (u1.get_v1()<u2.get_v1());}int main(void){ vector<unit> units; srand(time(NULL)); int i = 10; while (--i>=0) { unit u; u.set_v1(rand()%100+1); u.set_v2(rand()%100+1); units.push_back(u); } vector<unit>:: iterator iter = units.begin(); while (iter!=units.end()) { cout<<*iter; iter++; } puts("after sort with overload <:"); sort(units.begin(),units.end()); iter = units.begin(); while (iter!=units.end()) { cout<<*iter; iter++; } puts("after sort with self function less_compare:"); sort(units.begin(),units.end(),less_compare); iter = units.begin(); while (iter!=units.end()) { cout<<*iter; iter++; } return 0;}这里编译
- C/C++ code
bool less_compare(const unit& u1, const unit& u2){ return (u1.get_v1()<u2.get_v1());}这一段代码出错,出错的信息是
/home/revival/code_blocks_project/class_vector_sort/main.cpp||In function ‘bool less_compare(const unit&, const unit&)’:|
/home/revival/code_blocks_project/class_vector_sort/main.cpp|66|error: passing ‘const unit’ as ‘this’ argument of ‘int unit::get_v1()’ discards qualifiers|
/home/revival/code_blocks_project/class_vector_sort/main.cpp|66|error: passing ‘const unit’ as ‘this’ argument of ‘int unit::get_v1()’ discards qualifiers|
||=== Build finished: 2 errors, 0 warnings ===|
我看到this我就把两个数据成员改成public然后把函数改成:
- C/C++ code
bool less_compare(const unit& u1, const unit& u2){ return (u1.v1<u2.v1);}就不报错了。但是我还是没明白什么意思。
麻烦各位大牛了。。。
------解决方案--------------------
主要问题就是个const的问题.
函数后面加const代表 *this是const.
同样,对于一个const的对象,能访问的成员函数也只有加了const的.
1.能加上const就加上,所以,如果那个不改变类的成员,那么就可以加上
2.bool less_compare(const unit& u1, const unit& u2)
{
return (u1.get_v1()<u2.get_v1());
}
u1,u2是const的,但是,get_v1不是,所以无法访问.
而改成 u1.v1之后,这个就没那个限制了.可以访问.
[解决办法]
因为return (u1.get_v1()<u2.get_v1());
你的get_v1不是const成员函数所以会报错。