【问题标题】:How to create operator overload?如何创建运算符重载?
【发布时间】:2020-07-01 22:34:01
【问题描述】:

我有如下代码,我需要编写一个全局函数,重载此类对象的加法运算符,以便生成的对象表示由“+”号分隔的两个字符串的串联。有人可以帮我吗?

class A {
    char* str;
    // ...
};

【问题讨论】:

标签: c++ visual-c++ c++17


【解决方案1】:

这样的操作符应该可以访问类的内容并创建一个它返回的类 A 的新实例。假设没有访问str的公共接口,这样的操作员必须是一个朋友功能,其签名类似于下面的一个

class A {
    char* str;
    // ...

    friend A operator+ (const A& arg1, const A& arg2)
    {
         A temp{arg1};  // assuming that A have a copy constructor

         // perform concatenation of temp and arg2 here

         return temp; 
    }
};

【讨论】:

    【解决方案2】:

    试试这样的:

    class A 
    {
        char* str;
        // ...
    
    public:
        A(const char *s = nullptr) : str(nullptr) {
            if (s) {
                str = new char[strlen(s)+1]);
                strcpy(str, s);
            }
        }
    
        A(const A &src) : A(src.str) {}
    
        A(A &&src) : str(src.str) { src.str = nullptr; }
    
        ~A() { delete[] str; }
    
        A& operator= (A rhs) {
            A temp{std::move(rhs)};
            std::swap(str, temp.str);
            return *this;
        }
    
        friend A operator+ (const A& arg1, const A& arg2)
        {
             A temp;
             temp.str = new char[strlen(arg1.str)+1+strlen(arg2.str)+1];
             sprintf(temp.str, "%s+%s", arg1.str, arg2.str);
             return temp; 
        }
    };
    

    话虽如此,你真的应该使用std::string 而不是char*

    class A 
    {
        std::string str;
        // ...
    
    public:
        A(const std::string &s = "") : str(s) {}
    
        friend A operator+ (const A& arg1, const A& arg2)
        {
            return A{arg1.str + "+" + arg2.str};
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2012-12-09
      • 2016-09-25
      • 2019-10-16
      • 1970-01-01
      • 2012-05-29
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多