수색…
통사론
- 복사 생성자
- MyClass (const MyClass & other);
- MyClass (MyClass 및 기타);
- MyClass (volatile const MyClass 및 기타);
- MyClass (휘발성 MyClass 및 기타);
- 지정 생성자
- MyClass & 연산자 = (const MyClass & rhs);
- MyClass & operator = (MyClass & rhs);
- MyClass & operator = (MyClass rhs);
- const MyClass & operator = (const MyClass & rhs);
- const MyClass & operator = (MyClass & rhs);
- const MyClass & operator = (MyClass rhs);
- MyClass 연산자 = (const MyClass & rhs);
- MyClass 연산자 = (MyClass & rhs);
- MyClass 연산자 = (MyClass rhs);
매개 변수
rhs | 오른손 쪽 복사 및 할당 생성자 모두에 대한 동등 함. 예를 들어 할당 생성자 : MyClass operator = (MyClass & rhs); |
---|---|
자리 표시 자 | 자리 표시 자 |
비고
배정 연산자
할당 연산자는 이미 존재하는 (이전에 초기화 된) 객체를 다른 객체의 데이터로 대체 할 때 사용됩니다. 이를 예로 들어 보겠습니다.
// Assignment Operator
#include <iostream>
#include <string>
using std::cout;
using std::endl;
class Foo
{
public:
Foo(int data)
{
this->data = data;
}
~Foo(){};
Foo& operator=(const Foo& rhs)
{
data = rhs.data;
return *this;
}
int data;
};
int main()
{
Foo foo(2); //Foo(int data) called
Foo foo2(42);
foo = foo2; // Assignment Operator Called
cout << foo.data << endl; //Prints 42
}
여기서 foo
객체를 이미 초기화했을 때 대입 연산자를 호출합니다. 그런 다음 나중에 foo2
에 foo
할당합니다. 등호 연산자를 호출 할 때 나타나는 모든 변경 사항은 operator=
함수에 정의되어 있습니다. 다음에서 실행 가능한 출력을 볼 수 있습니다. http://cpp.sh/3qtbm
복사 생성자
한편, 복사 생성자는 할당 생성자와 완전히 반대입니다. 이번에는 이미 존재하지 않는 (또는 이전에 초기화되지 않은) 객체를 초기화하는 데 사용됩니다. 즉, 복사중인 객체를 실제로 초기화하지 않고 할당하려는 객체의 모든 데이터를 복사한다는 의미입니다. 이제 이전과 같은 코드를 살펴 보도록하겠습니다. 그러나 할당 생성자를 복사 생성자로 수정하십시오.
// Copy Constructor
#include <iostream>
#include <string>
using std::cout;
using std::endl;
class Foo
{
public:
Foo(int data)
{
this->data = data;
}
~Foo(){};
Foo(const Foo& rhs)
{
data = rhs.data;
}
int data;
};
int main()
{
Foo foo(2); //Foo(int data) called
Foo foo2 = foo; // Copy Constructor called
cout << foo2.data << endl;
}
여기서 볼 수 있습니다 Foo foo2 = foo;
주요 함수에서 나는 객체를 실제로 초기화하기 전에 즉시 객체를 할당하는데, 이는 이전에 복사 생성자라는 것을 의미한다. 그리고 foo2
객체에 대한 매개 변수 int를 전달할 필요가 없다는 것을 알아 foo2
. 객체 foo에서 이전 데이터를 자동으로 가져 왔기 때문입니다. 다음은 예제 출력입니다. http://cpp.sh/5iu7
복사 생성자 대 할당 생성자
이제 우리는 복사 생성자와 할당 생성자가 위에 무엇인지 간단히 살펴보고 각각의 예제를 제공하여 두 코드가 동일한 코드에서 보도록하자. 이 코드는 위의 두 가지와 유사합니다. 이걸 가져 가자.
// Copy vs Assignment Constructor
#include <iostream>
#include <string>
using std::cout;
using std::endl;
class Foo
{
public:
Foo(int data)
{
this->data = data;
}
~Foo(){};
Foo(const Foo& rhs)
{
data = rhs.data;
}
Foo& operator=(const Foo& rhs)
{
data = rhs.data;
return *this;
}
int data;
};
int main()
{
Foo foo(2); //Foo(int data) / Normal Constructor called
Foo foo2 = foo; //Copy Constructor Called
cout << foo2.data << endl;
Foo foo3(42);
foo3=foo; //Assignment Constructor Called
cout << foo3.data << endl;
}
산출:
2
2
여기서 우리는 Foo foo2 = foo;
라인을 실행하여 복사 생성자를 먼저 호출하는 것을 볼 수 있습니다 Foo foo2 = foo;
. 이전에 초기화하지 않았으므로 그리고 나서 우리는 foo3에 대한 대입 연산자를 이미 초기화 foo3=foo
때문에 호출합니다. foo3=foo
;