如何创建运算符重载?

Posted

技术标签:

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

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

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

【问题讨论】:

你读过***.com/questions/4421706/…吗?然后尝试为您的班级实施operator+ 你先上网搜索了吗? “C++重载运算符”有很多结果 【参考方案1】:

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

class A 
    char* str;
    // ...

    friend A operator+ (const A& arg1, const A& arg2)
    
         A temparg1;  // 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 tempstd::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 Aarg1.str + "+" + arg2.str;
    
;

【讨论】:

以上是关于如何创建运算符重载?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中为枚举重载运算符?

C++ 输入/输出运算符重载

c++运算符重载

虚拟赋值运算符重载——如何选择正确的重载函数?

C++中如何重载输入输出流运算符使其可用于矩阵的输入输出?

关于运算符重载