C++运算符重载的有关问题
C++运算符重载的问题
C++在重载运算符的时候什么要用const
今天遇到个例子。
这里bool operator <(const unit& u) const没有报错,我之前是写成bool operator <(unit& u) ;报错。后来进去看了下是要const修饰,我想问下。重载什么运算符需要用到const?
还有个问题见代码:
这里编译
这一段代码出错,出错的信息是
/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++在重载运算符的时候什么要用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); }
就不报错了。但是我还是没明白什么意思。
麻烦各位大牛了。。。
------解决方案--------------------