• 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有效,对其他的类无效
    • 尽量少用操作符重载
  • 相关阅读:
    BZOJ3105 新Nim游戏 【拟阵】
    Codeforces1037G A Game on Strings 【SG函数】【区间DP】
    @RequestBody和@RequestParam
    Swagger学习
    单点登录SSO
    工作流学习
    Lombok
    PageHelper分页插件
    mybatis逆向工程介绍
    跨域请求的解决方案
  • 原文地址:https://www.cnblogs.com/xidongyu/p/6915192.html
Copyright © 2020-2023  润新知