조항12: 대상을 복제할 때 각 성분을 잊지 마라
고객을 나타내는 클래스를 고려하여 수동으로 코핑 함수를 작성합니다.
- void logCall(const std::string& funName);// log entry
- class Customer
- {
- public:
- ...
- Customer(const Customer& rhs);
- Customer& operator=(const Customer& rhs);
- ...
- private:
- std::string name;
- };
- Customer::CUstomer(const Customer& rhs):name(rhs.name)
- {
- logCall("Customer copy constructor");
- }
- Customer& Customer::operator=(const Customer& rhs)
- {
- logCall("Customer copy assignment operator");
- name = rhs.name;
- return *this;
- }
이상은 옳습니다.
데이터를 추가하는 경우:
- class Date{...};//
- class Customer
- {
- public:
- ... //
- private:
- std::string name;
- Date lastTransaction;
- };
이때copying은 국부 복사를 실행합니다. 고객의name를 복사했지만,lastTransaction에 새로 추가된 값이 없습니다. 대부분의 컴파일러들은 경고를 하지 않습니다.클라스에 구성원 변수를 추가하려면copying 함수를 동시에 수정해야 합니다.
상속될 경우 잠재적인 위기가 발생할 수 있습니다.
- class PrioCustomer:public Customer
- {
- public:
- ...
- PrioCustomer(const PrioCustomer& rhs);
- PrioCustomer& operator=(const PrioCustomer& rhs);
- ...
- private:
- int prio;
- };
- PrioCustomer::PrioCustomer(const PrioCustomer& rhs):prio(rhs.prio)
- {
- logCall("PrioCustomer copy constructor");
- }
- PrioCustomer& PrioCustomer::operator=(const PrioCustomer& rhs)
- {
- logCall("PrioCustomer copy assignment operator");
- prio = rhs.prio;
- return *this;
- }
보아하니 Prio Customer 내의 모든 데이터를 복제한 것 같지만, 모든 Prio Customer에는 상속된 Customer 구성원 변수가 포함되어 있지만, 그 변수는 부여되지 않았다.
상속 클래스의 copying 함수를 해당 기본 클래스 함수로 호출해야 합니다.
- PrioCustomer::PrioCustomer(const PrioCustomer& rhs)
- :Customer(rhs),prio(rhs.prio)
- {
- logCall("PrioCustomer copy constructor");
- }
- PrioCustomer& PrioCustomer::operator=(const PrioCustomer& rhs)
- {
- logCall("PrioCustomer copy assignment operator");
- Customer::operator=(rhs);
- prio = rhs.prio;
- return *this;
- }
copying 함수를 작성하면, 모든local 구성원 변수를 복사하고, 모든 기본 클래스의 적절한copying 함수를 호출하는지 확인하십시오.
copy assignment 조작부호를copy 구조 함수로 호출하는 것은 불합리합니다.
코피 구조 함수를 코피 assignment 조작부호로 호출하는 것도 불합리하다.
만약 당신의copy구조 함수와copyassignment 조작부호가 비슷한 코드를 가지고 있다는 것을 발견한다면, 중복 코드를 제거하는 방법은 새로운 구성원 함수를 만들어서 둘을 호출하는 것이다. 이런 함수는private이며, 흔히 init라고 명명된다.
1. Copying 함수는'대상 내의 모든 구성원 변수'와'모든 기류 성분'을 복제해야 한다.
2. 어떤copying함수로 다른copying함수를 실현하려고 시도하지 말고 공통기능을 세 번째 함수에 놓고 두 개의copying함수로 공통적으로 호출해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
예를 들어 urlopen의 데이터 사용법데이터 매개 변수는 선택할 수 있습니다. 데이터를 추가하려면 바이트 인코딩 형식의 내용, 즉bytes 형식이면bytes () 함수를 통해 전환할 수 있습니다. 또한 이 데이터 매개 변수를 전달하면 GET 방식으로 요...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.