zoukankan      html  css  js  c++  java
  • 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有效,对其他的类无效
    • 尽量少用操作符重载
  • 相关阅读:
    Java.io.outputstream.PrintStream:打印流
    Codeforces 732F. Tourist Reform (Tarjan缩点)
    退役了
    POJ 3281 Dining (最大流)
    Light oj 1233
    Light oj 1125
    HDU 5521 Meeting (最短路)
    Light oj 1095
    Light oj 1044
    HDU 3549 Flow Problem (dinic模版 && isap模版)
  • 原文地址:https://www.cnblogs.com/xidongyu/p/6915192.html
Copyright © 2011-2022 走看看