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有效,对其他的类无效
  • 尽量少用操作符重载
posted @ 2017-05-28 10:22  被罚站的树  阅读(244)  评论(0编辑  收藏  举报