c++之旅:操作符重载
操作符重载
操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是类
那些操作符可以重载
除了下面几个操作符不能重载外,其它的操作符都能重载
- .
- ::
- .*
- ?:
- sizeof
操作符重载的本质
操作符重载的本质函数调用
#include <iostream>
#include <cstring>
using namespace std;
class MyString {
private:
char* str;
public:
MyString(const char* str) {
this->str = new char[100];
strcpy(this->str, str);
}
~MyString() {
delete []str;
str = NULL;
}
MyString(const MyString& myString) {
str = new char[100];
strcpy(str, myString.str);
}
MyString operator+ (const char* str) { // 对+操作符进行了重载
strcat(this->str, str); // 将传入的字符串拼接到原字符串后面
return *this;
}
void operator= (const MyString& myString) { //对=操作符进行了重载
strcpy(str, myString.str);
}
const char* get() {
return str;
}
};
int main(int argc, char* argv[]) {
MyString myString("abc");
myString = myString + "def";
cout << myString.get() << endl;
return 0;
}
MyString是一个类,在该类中对+操作符和=操作符进行了重载,main函数中的第二行代码将会被编译器翻译成下面的代码
myString.operator=(myString.operator+("def"));
从翻译过来的代码中我们可以看到实际就是函数调用,只不过函数比较特殊而已。其实我们可以完全在自己代码中直接写上面的代码,只不过可读性比较差且书写不方便
一元操作与二元操作
上面的代码中,我们只重载了=和+,且只接受一个参数,这使得+只支持一元操作。但是+操作本来是一个二元操作。简单的说,就是上面的代码只支持
myString + "def"
并不支持
"def" + myString
为了完善+操作功能,代码需要修改如下
#include <iostream>
#include <cstring>
using namespace std;
class MyString {
private:
char* str;
public:
MyString(const char* str) {
this->str = new char[100];
strcpy(this->str, str);
}
~MyString() {
delete []str;
str = NULL;
}
MyString(const MyString& myString) {
str = new char[100];
strcpy(str, myString.str);
}
MyString operator+ (const char* str) { // 对+操作符进行了重载
strcat(this->str, str); // 将传入的字符串拼接到原字符串后面
return *this;
}
void operator= (const MyString& myString) { //对=操作符进行了重载
strcpy(str, myString.str);
}
const char* get() {
return str;
}
friend MyString operator+ (const char* str, const MyString& myString);
};
MyString operator+ (const char* str, const MyString& myString) {
char* tmp = new char[100];
sprintf(tmp, "%s%s", str, myString.str);
return MyString(tmp);
}
int main(int argc, char* argv[]) {
MyString myString("abc");
myString = "def" + myString;
cout << myString.get() << endl;
return 0;
}
重载一元操作符一般写在类的方法里,而二元操作符一般写在类外面并将该操作符设置为类的友元方法。
操作符重载注意事项
- 操作符重载只针对类而言,一元操作符必须写到类的内部,二元操作符必须要有一个参数为类
- 操作符重载并不是全局的,只针对重载的类生效。比如对MyString的+重载了,那么+操作只对MyString有效,对其他的类无效
- 尽量少用操作符重载