3 Haziran 2017 Cumartesi

Copy Asssignment Operator

Giriş
Şu koşullarda üretilmez.
1. you have explicitly declared a copy-assignment operator (for class X an operator = taking XX& or const X&) )
2.there is a member in your class that is not assignable (such as a reference, a const object or a class with no or inaccessible assignment operator)
3. (C++11) you have explicitly told the compiler to not generate one using A& operator=(const A&) = delete;
İmzası
Metodun imzası kendine referans dönecek şekilde.
MyClass& MyClass::operator=(const MyClass &right) {  ...
  return *this;
}
Sebebi ise şu şekilde kullanım.
MyClass p1; 
MyClass p2;
MyClass p2;

// ...

p3 = p2 = p1;  //assigns all the contents of p1 to p2 and then to p3
Bu kullanım şekli ile şu aynı şeyler.
p3.operator=(p2.operator=(p1));
Örnek
Copy Assignment sol tarafın r-value olmasına izin verir. Elimizde şöyle bir kod olsun.
typedef struct Bar
{
  unsigned long low;
  long high;
}
Bar;

struct FooStruct
{
private:
  Bar bar;

public:
  void SetBar(Bar m)
  {
    bar = m;
  }

  Bar GetBar()
  {
    return bar;
  }
};

int main()
{
  FooStruct f;
  Bar m1 = { 1,1 };
  Bar m2 = { 2,2 };
  f.SetBar(m1);
  f.GetBar() = m2;     // Here I'd expect an error such as
                       // "error: lvalue required as left operand of assignment"
}
Açıklaması şöyle
This works because longlong is a class, and as such = is longlong::operator =, the implicitly-defined assignment operator. And you can call member functions on temporaries as long as they're not qualified with & (the default operator = is unqualified).

To restrict the assignment operator to lvalues, you can explicitly default it with an additional ref-qualifier
Sağ tarafın l-value olmasını istersek şöyle yaparız.
struct Bar
{
  Bar &operator = (Bar const &) & = default;
  ...                    ^
};
Const Üye Olması
Bu metodun üretilmemesine sebep olan ikinci madde - yani const üye olması şöyle.
class Foo {
public:
  const int a;
  Foo(int aa) : a(aa){}};
int main() {
  std::vector<Foo> v;
  v.emplace_back(1);
  v.emplace_back(2);
  v.emplace_back(3);
  v.emplace_back(4);

  std::iter_swap(v.begin() + 1, v.rbegin());

  system("pause");
  return 0;
}
 Hata mesajı olarak şunu alırız.
Error C2280   'Foo &Foo::operator =(const Foo &)':
 attempting to reference a deleted function

Hiç yorum yok:

Yorum Gönder