读书人

C++运算符重载的有关问题

发布时间: 2012-04-27 11:57:44 作者: rapoo

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成员函数所以会报错。

读书人网 >C++

热点推荐