C++에서 할당 연산자 오버로딩 구현
이 기사에서는 C++에서 할당 연산자 오버로딩을 구현하는 방법에 대한 몇 가지 방법을 설명합니다.
복사 할당 연산자
를 사용하여 C++에서 오버로드 된 할당 연산자 구현
C++는 기본 제공 연산자가 특정 클래스에서 호출 될 때 사용자 지정 함수를 호출하는 일반적인 방법 인 연산자 오버로드 기능을 제공합니다. 이러한 함수는operator
로 시작하는 특수 이름 뒤에 특정 연산자 기호가 있어야합니다. 예를 들어, 사용자 지정 할당 연산자는operator=
라는 함수로 구현할 수 있습니다. 할당 연산자는 일반적으로 왼쪽 피연산자에 대한 참조를 반환해야합니다. 사용자가 복사 할당 연산자를 명시 적으로 정의하지 않으면 컴파일러에서 자동으로 하나를 생성합니다. 생성 된 버전은 클래스에 힙 메모리에 수동으로 할당 된 데이터 멤버가 포함되어 있지 않을 때 매우 유용합니다. 각 요소를 해당 개체 구성원에 할당하여 배열 구성원을 처리 할 수도 있습니다. 그러나 다음 예제 코드와 같이 동적 메모리 데이터 멤버를 처리 할 때 단점이 있습니다.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class Person {
public:
Person() {
name = new string;
surname = new string;
};
Person(string n, string s) {
name = new string(std::move(n));
surname = new string(std::move(s));
}
Person(Person &p) {
name = new string(*p.name);
surname = new string(*p.surname);
}
~Person() {
delete name;
delete surname;
}
void renamePerson(const string &n, const string &s) {
name->assign(n);
surname->assign(s);
};
void printPerson() { cout << *name << " " << *surname; }
private:
string *name;
string *surname;
};
int main() {
Person P1("Buddy", "Rich");
Person P2 = P1;
P1.printPerson();
cout << endl;
P2.printPerson();
cout << endl;
P1.renamePerson("Jay", "Roach");
P1.printPerson();
cout << endl;
P2.printPerson();
cout << endl;
Person P3;
P3 = P1;
P1.printPerson();
cout << endl;
P3.printPerson();
cout << endl;
P1.renamePerson("Liam", "White");
P1.printPerson();
cout << endl;
P3.printPerson();
cout << endl;
exit(EXIT_SUCCESS);
}
출력:
Buddy Rich
Buddy Rich
Jay Roach
Buddy Rich
Jay Roach
Jay Roach
Liam White
Liam White
위의 코드는copy-constructor
만 명시 적으로 정의하므로P1
개체 내용이P3
개체에 할당 될 때 잘못된 동작이 발생합니다. P1.renamePerson
함수에 대한 두 번째 호출은P3
개체의 데이터 멤버를 수정해서는 안되지만 수정되었습니다. 이에 대한 해결책은 오버로드 된 할당 연산자, 즉 복사 할당 연산자를 정의하는 것입니다. 다음 코드 조각은 복사 할 수있는Person
클래스 버전을 구현하여 동일한 클래스의 두 개체를 올바르게 할당합니다. 그러나 복사 할당 함수의if
문은 개체가 자신에게 할당 된 경우에도 연산자가 올바르게 작동 함을 보장합니다.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class Person {
public:
Person() {
name = new string;
surname = new string;
};
Person(string n, string s) {
name = new string(std::move(n));
surname = new string(std::move(s));
}
Person(Person &p) {
name = new string(*p.name);
surname = new string(*p.surname);
}
~Person() {
delete name;
delete surname;
}
Person &operator=(const Person &p) {
if (this != &p) {
*name = *(p.name);
*surname = *(p.surname);
}
return *this;
}
void renamePerson(const string &n, const string &s) {
name->assign(n);
surname->assign(s);
};
void printPerson() { cout << *name << " " << *surname; }
private:
string *name;
string *surname;
};
int main() {
Person P1("Buddy", "Rich");
Person P2 = P1;
P1.printPerson();
cout << endl;
P2.printPerson();
cout << endl;
P1.renamePerson("Jay", "Roach");
P1.printPerson();
cout << endl;
P2.printPerson();
cout << endl;
Person P3;
P3 = P1;
P1.printPerson();
cout << endl;
P3.printPerson();
cout << endl;
P1.renamePerson("Liam", "White");
P1.printPerson();
cout << endl;
P3.printPerson();
cout << endl;
exit(EXIT_SUCCESS);
}
출력:
Buddy Rich
Buddy Rich
Jay Roach
Buddy Rich
Jay Roach
Jay Roach
Liam White
Jay Roach
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook