运算符重载(二)

    String类:

一 []运算符的重载

    []运算符的使用可能有以下几种情况:

String s1="asdfdsf";
const String s2="abcd";

char A=s1[2]; //1
s1[2]='a'; //2

char B=s2[2];  //3
s2[2]='b';  //4

对于1和2的情况,需要重载:

char& operator[](unsigned int index);

返回引用是为了可以实现情况2。

    对于const String,3允许但4不允许,所以要返回const string&

char& String::operator[](unsigned int index)
{
    //return str_[index];
    //non const 版本调用 const版本
    return const_cast<char&>(static_cast<const String&>(*this)[index]);//先把*this转换成从const,调用const函数,在去掉const属性
}
const char& String::operator[](unsigned int index) const
{
    return str_[index];
}

二 +运算符的重载

String s3 = "xxx";
String s4 = "yyy";

String s5 = s3 + s4; //1
String s6 = "zzz" + s4;  //2

    为了允许情况2,+运算符需要重载为友元,同时还要有一个转换构造函数配合:

friend oprator+(const String& s1, const String& s2);

 但是不允许+两侧都是非对象类型。

String String::(const String& s1, cosnt String& s2)
{
    int len = strlen(s1.str_) + strlen(s2.str_) + 1;
    char* newstr = new char[len];
    memset(newstr, 0, len);
    strcpy(newstr, s1.str_);
    strcat(newstr, s2.str_);

    String tmp(newstr);
    delete newstr;
    return tmp;
}

三 <<运算符

friend ostream& operator<<(ostream& os, cosnt String& s);

 四 类型转换运算符的重载

    有一个Integer类,有一个实例a,执行:int x=a;显然是会出错的,此时可以重载类型转换运算符将类转换为其他类型。函数原型:  

                                                                       operator 类型名();

    可以看出,不能指定返回类型。例:operator int();

五 ->运算符

#include <iostream>
using namespace std;

class DBHelper
{
public:
    DBHelper()
    {
        cout << "DBHelper" << endl;
    }
    ~DBHelper()
    {
        cout << "~DBHelper" << endl;
    }
    void open()
    {
        cout << "open()" << endl;
    }
    void close()
    {
        cout << "close()" << endl;
    }
    void query()
    {
        cout << "query" << endl;
    }

};

class DB
{
public:
    DB()
    {
        db_ = new DBHelper;
    }
    ~DB()
    {
        delete db_;
    }
    DBHelper* operator->()
    {
        return db_;
    }
private:
    DBHelper* db_;
};

int main()
{
    DB db;
    db->open();
    db->query();
    db->close();

    return 0;
}
原文地址:https://www.cnblogs.com/lulu10922/p/5832491.html