15 Mayıs 2019 Çarşamba

Copy Initialization - Sadece Object İçindir

Giriş
Foo foo = myparameter şeklindeki kullanımdır.

Brace Initialization, Default Initialization object dışındaki tipler için de kullanılabilir. Ancak Copy Initialization sadece object için kullanılır.

Örnek
Şöyle yaparız.
sample s = sample(new oops);
Örnek
Elimizde şöyle bir sınıf olsun.
class Foo
{
  int value;
  string str_value;

public:

  Foo(int param) { value = param; }

  Foo(string param)
  {
    str_value = param;
  }
};
Copy Initialization için şöyle yaparız.
Foo foo1  = 2;  //çevrim yok
Foo foo2 = "4"; //1 çevrim
MyParameter Sadece Tek Bir Defa Çevrilebilir
Açıklaması şöyle.
If T is a class type, and the cv-unqualified version of the type of other is not T or derived from T, or if T is non-class type, but the type of other is a class type, user-defined conversion sequences that can convert from the type of other to T (or to a type derived from T if T is a class type and a conversion function is available) are examined and the best one is selected through overload resolution.
Other'tan T'ye tek bir defa çevrim yapılabilir. Açıklaması şöyle
Implicit conversion sequence consists of the following, in this order:
1) zero or one standard conversion sequence;
2) zero or one user-defined conversion;
3) zero or one standard conversion sequence.

Örnek
Elimizde şöyle bir kod olsun.
template <typename Type>
struct Class
{
  Type data;
  Class(Type data) : data(data) { }
};
Şu kod derlenmez. Çünkü 2 defa çevrim yapmak gerekiyor.
Class<std::string> b = "abc";
Açıklaması şöyle.
It doesn't work because it would involve two user-defined conversions:

from const char* to std::string,
from std::string to Class<std::string>.
But at most one is allowed.

C++17 Farkı
Copy Initialization sonucunda bir nesnenin C++17'ye kadar Copy Constructor ya da Move Constructor metodlarından birisi çağrılır.

C++17 ile işler biraz değişti. Açıklaması şöyle.
C++17 made some changes to the set of value categories objects fall in. In C++17, sample(new oops) becomes a prvalue, and the c++17 standard mandates that compilers are required to yeet prvalues into place without copying it or moving them. This is done through a combination of dark magic and sorcery.


Hiç yorum yok:

Yorum Gönder