用于处理 a = b + c 的 C++ 运算符语法,无需显式复制 "a.data_ptr"中的数据

标签 c++ operator-keyword

我想进一步详尽地讨论这个话题。

假设我有类似的东西:

class MyClass
{
public: 

MyClass(int N)
{ 
    data_ptr = new float[N];
};

float* dat_ptr;    

// ... clever operator definition here ...
};

所以我希望能够简单地写:

MyClass a(4);
MyClass b(4);
MyClass c(4);

// modify b.data_ptr and c.data_ptr ....
// Use "clever operator"
a = b + c;

操作符将执行 a.data_ptr[i] = b.data_ptr[i] + c.data_ptr[i] for i=0:(N-1) ...

因此,不会创建额外的数据拷贝,并且我们巧妙地使用预分配的缓冲区。

这可能吗?如果是这样,请向我提供一些关于如何完成的见解。

谢谢!

最佳答案

如果您使用 C++11 中的移动语义,则可以。

class MyClass
{
public: 

    MyClass(int N)
    { 
        data_ptr = new float[N];
        n = N;
    }

    MyClass(MyClass && rhs)
    {
        data_ptr = rhs.data_ptr;
        n = rhs.n;

        rhs.data_ptr = nullptr;
    }

    // dtor, copy-ctor etc.

    int n;
    float * dat_ptr;    
};

MyClass operator + (const MyClass & left, const MyClass & right)
{
    MyClass result(left.n);

    // Implement addition
}

// Note: no error-checking

这样会创建一个临时对象,但内部数据不会被不必要地复制。

阅读more关于移动语义。

关于用于处理 a = b + c 的 C++ 运算符语法,无需显式复制 "a.data_ptr"中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16810071/

相关文章:

C++ 堆栈推送/打印实现

c++ - 与运算符重载不匹配运算符+错误

c++ - 重载小于 C++ 中的运算符出现错误

lua - 我可以在 Lua 中覆盖冒号运算符吗?

c++ - 非成员(member)运营商作为外国类(class)的私有(private)成员(member)

c++ - 如何访问 iPod/iPhone 上的图片文件?

c++ - GDI 无法转换为具有精确调色板的索引颜色?

C++动态内存分配问题

c++ - 如何将用户输入存储为 char*?

c++重载[]以打印链表的第n项