C ++에서 할당 생성자와 복사 생성자의 차이점을 이해하지 못합니다. 다음과 같습니다.
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
할당 생성자 및 복사 생성자의 메모리를 할당하는 방법을 알고 싶습니다.
답변
복사 생성자는 초기화하는 데 사용됩니다 이전에 초기화되지 않은 다른 개체의 데이터에서 개체를.
A(const A& rhs) : data_(rhs.data_) {}
예를 들면 :
A aa;
A a = aa; //copy constructor
할당 연산자는 a의 데이터를 교환하는 데 사용됩니다 이전에 초기화 다른 개체의 데이터와 객체를.
A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}
예를 들면 :
A aa;
A a;
a = aa; // assignment operator
복사 구성을 기본 구성과 할당으로 바꿀 수 있지만 효율성이 떨어집니다.
(부수적으로 : 위의 구현은 컴파일러가 무료로 제공하는 것과 정확히 일치하므로 수동으로 구현하는 것은별로 의미가 없습니다.이 두 가지 중 하나가 있으면 일부 리소스를 수동으로 관리 할 가능성이 큽니다. 이 경우 The Rule of Three 에 따라 다른 하나와 소멸자가 필요할 가능성이 큽니다.)
답변
복사 생성자와 할당 연산자의 차이는 초보 프로그래머에게 많은 혼란을 야기하지만 실제로 그렇게 어렵지는 않습니다. 요약 :
- 복사하기 전에 새 객체를 만들어야하는 경우 복사 생성자가 사용됩니다.
- 복사하기 전에 새 개체를 만들 필요가없는 경우 할당 연산자가 사용됩니다.
할당 연산자의 예 :
Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator
복사 생성자의 예 :
Base obj1(5);
Base obj2 = obj1; //calls copy constructor
답변
첫 번째는 복사 초기화이고 두 번째는 할당입니다. 할당 생성자와 같은 것은 없습니다.
A aa=bb;
컴파일러 생성 복사 생성자를 사용합니다.
A cc;
cc=aa;
기본 생성자를 사용하여을 생성 cc
한 다음 operator =
이미 존재하는 객체에 대한 * 할당 연산자 ** ( )를 사용합니다.
할당 생성자 및 복사 생성자의 메모리를 할당하는 방법을 알고 싶습니다.
이 경우 메모리 할당이 의미하는 바를 IDK하지만 어떤 일이 발생하는지 확인하려면 다음을 수행 할 수 있습니다.
class A
{
public :
A(){ cout<<"default constructor"<<endl;};
A(const A& other){ cout<<"copy constructor"<<endl;};
A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};
또한 다음을 살펴 보시기 바랍니다.
답변
간단히 말해서
복사 생성자는 기존 개체의 복사본으로 기존 개체에서 새 개체를 만들 때 호출됩니다. 그리고 할당 연산자는 이미 초기화 된 개체에 다른 기존 개체의 새 값이 할당 될 때 호출됩니다.
예-
t2 = t1; // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"
답변
@Luchian Grigore Said가 이렇게 구현 된 것
class A
{
public :
int a;
A(){ cout<<"default constructor"<<endl;};
A(const A& other){ cout<<"copy constructor"<<endl;};
A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};
void main()
{
A sampleObj; //Calls default constructor
sampleObj.a = 10;
A copyConsObj = sampleObj; //Initializing calls copy constructor
A assignOpObj; //Calls default constrcutor
assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}
산출
기본 생성자
복사 생성자
기본 생성자
할당 연산자
답변
복사 생성자와 할당 생성자의 차이점은 다음과 같습니다.
- 복사 생성자의 경우 새 개체를 만듭니다.
<classname> <o1>=<o2>
) - 할당 생성자의 경우 객체를 생성하지 않는다는 것은 이미 생성 된 객체 (
<o1>=<o2>
) 에 적용됨을 의미합니다 .
그리고 둘 다의 기본 기능은 동일하며 데이터를 o2에서 o1 멤버별로 복사합니다.
답변
이 주제에 대해 한 가지 더 추가하고 싶습니다. “할당 연산자의 연산자 함수는 클래스의 멤버 함수로만 작성되어야합니다.” 다른 이항 또는 단항 연산자와는 달리 친구 함수로 만들 수 없습니다.