Try something like this:
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; 
    }
};
That being said, you really should use std::string instead of 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};
    }
};