最近写代码的时候,需要重载 == ,以前也没有进行过太多的思考,都是顺手就写了,在这里就总结一下:
下面的代码是 应该是重载 == 用的最多的写法了
class Demo {
public:
Demo(int a_):a(a_) {
}
~Demo() {}
bool operator == (const Demo & rhs) const {
return this->a == rhs.a;
}
bool operator != (const Demo & rhs) const {
return !(*this == rhs);
}
private:
int a;
};
还有一种方法是 使用友元函数,友元函数也能够访问类的私有成员
class Demo {
public:
Demo(int a_):a(a_) {
}
~Demo() {}
friend bool operator == (const Demo & lhs ,const Demo & rhs);
friend bool operator != (const Demo & lhs ,const Demo & rhs);
private:
int a;
};
bool operator == (const Demo & lhs ,const Demo & rhs) {
return lhs.a == rhs.a;
}
bool operator != (const Demo & lhs, const Demo & rhs) {
return !(lhs == rhs);
}
注意 友元函数不能加 函数后边不能加 const 限定符,如果加了,编译就会报 cannot have cv-qualifier 的错误,因为 const 和 volatile 都是 用来修饰 类成员函数的,不是类的成员函数 就不能用 const 修饰
那么对于 == 和 != ,能不能 一个重载成友元函数,一个重载成成员函数呢,是可以的
class Demo {
public:
Demo(int a_):a(a_) {
}
~Demo() {}
friend bool operator == (const Demo & lhs ,const Demo & rhs);
bool operator != (const Demo & rhs) const {
return !(*this == rhs);
}
private:
int a;
};
bool operator == (const Demo & lhs ,const Demo & rhs) {
return lhs.a == rhs.a;
}
还有一种情况,就是我不使用 友元函数,能不能重载 ==,是可以的,但是必须提供可以获得成员变量的 get函数,注意get函数一定是const的 因为,const 类型只能调用 const 成员函数,否则编译就会报
passing ‘const Demo’ as ‘this’ argument discards qualifiers 的错误
class Demo {
public:
Demo(int a_):a(a_) {
}
~Demo() {}
int get() const {
return this->a;
}
private:
int a;
};
bool operator == (const Demo & lhs, const Demo & rhs) {
return lhs.get() == rhs.get();
}
bool operator != (const Demo & lhs, const Demo & rhs){
return !(lhs == rhs);
}
那么在不使用友元函数重载的情况下,是否可以,在成员函数内部,重载 != 的时候调用 == 呢,
经过其他朋友的指正,是可以的,因为涉及到互相调用,编译的时候,需要通过前置声明来解决。
class Demo;
bool operator == (const Demo & lhs ,const Demo & rhs);
class Demo {
public:
Demo(int a_):a(a_) {
}
~Demo() {}
bool operator != (const Demo & rhs) const {
return !(*this == rhs);
}
int get() const {
return this->a;
}
private:
int a;
};
bool operator == (const Demo & lhs ,const Demo & rhs) {
return lhs.get() == rhs.get();
}