这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?
虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:
c++ c++-faq copy-constructor assignment-operator copy-and-swap
C++中有4个运算符可以重载但不能作为独立(即非成员,独立)函数重载.这些运营商是:
operator = operator ()operator ->operator []这个主题完全解释了禁止operator =成为非成员函数的理由.关于其他三个的任何想法?
我有一个指向某些易失性内存的指针,我试图取消引用该内存并将其复制到该结构的非限定副本(反之亦然)。存储器的格式由第三方结构定义指定。在 C 中,我可以取消引用内存,一切都很好。然而,C++抱怨它找不到合适的赋值运算符(clang的错误在这里比gcc清楚得多:候选函数(隐式复制赋值运算符)不可行:'this'参数具有类型'易失性vec',但方法是未标记为易失性)。此方法对于简单类型(例如整数)非常有效,但对于结构则失败。
在这种特殊情况下,所指向的值在读取对象期间不能更改,但我必须防止它们在读取过程中被缓存。
我发现我可以添加从易失性 T 到 T 的隐式转换吗?这给了我很多尝试的选择,但是我无法找到让它真正发挥作用的魔力。我怀疑所有这些解决方案都会失败,因为为什么不能使用非成员函数来重载赋值运算符?这将导致我的第三方定义的结构没有合适的结构,因为结构定义是第三方的,但这是理论上的,因为我什至无法让手动指定的成员函数完全工作(也许我可以创建一个包装结构有明确的东西吗?)。
下面的示例在 C 中编译并运行,但在 C++ 中失败。不幸的是,更完整的问题还有其他方面迫使 C++ 这样做。让它发挥作用的魔力是什么?
#include <stdio.h>
#include <stdint.h>
struct __attribute__((__packed__)) vec {
uint32_t addr;
uint32_t len:24;
uint8_t id;
};
struct vec first = { .addr=0xfeedface, .len=10, .id=5};
volatile struct vec vvector;
int main(int argc, char **argv, char **envp)
{
struct vec cvector;
volatile struct vec *pvector = &vvector;
*pvector = first;
cvector = *pvector;
printf("%x %d %d %d\n", cvector.addr, cvector.len, cvector.id, sizeof(cvector)); …Run Code Online (Sandbox Code Playgroud) 根据对这个帖子的回复,operator=不能作为非成员函数重载.因此,例如,以下内容使编译器非常生气:
class MyClass
{
// ...
};
MyClass& operator=(MyClass& Left, MyClass& Right)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我有一个带getter和setter的容器类,因此不需要成员函数,它会破坏封装.上述线程的答案之一是说确保"L值被接收为其第一个操作数",但我不完全理解这意味着什么.有人可以澄清一下吗?
此外,有operator=,operator(),operator[]和operator->"古怪"的情况下......?或者我应该将所有重载的运算符实现为成员函数......?(我知道不这样做是完全合法的,但我正在寻找更好的做法.)
c++ oop encapsulation operator-overloading assignment-operator
为什么重载operator =强制要求成为成员函数($ 13.5.3),而不是复合赋值运算符,例如operator + =($ 13.5.2)?我在这里俯瞰什么吗?
我试图operator=在模板类中重载.
我有这个模板类:
template <class T>
class Matrice
{
T m,n;
public:
template <class V>
friend Matrice<V>& operator=(const Matrice<V> &);
};
template <class T>
Matrice<T>& Matrice<T>::operator=(const Matrice<T> &M)
{
/*...*/
return *this;
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
template <class T>
class Matrice
{
T m,n;
public:
template <class V>
Matrice<V>& operator=(Matrice<V> &);
};
template <class T>
Matrice<T>& operator=(Matrice<T> &M)
{
/*...*/
return *this;
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到这个错误:
error C2801: 'operator =' must be a non-static member
Run Code Online (Sandbox Code Playgroud)