-
[C++] student.cpp (복사 생성자의 개념)C++/clone code 2022. 6. 29. 00:07
복사 생성자
다른 객체의 내용을 복사해서 새로운 객체를 초기화하는 것
복사 생성자는 자신과 같은 타입의 객체를 매개 변수로 받음
얕은 복사
복사 생성자가 정의되어 있지 않은 경우 컴파일러가 알아서 디폴트 복사 생성자를 추가해줌
Car c1(0, 1, "grey"); Car c2(c1);
얕은 복사의 문제점
#include <iostream> #include <string> using namespace std; class Student { private: char* name; // 이름 int number; // 학번 public: //생성자 Student(const char* pn, int n) { //const 빠지면 컴파일 오류! name = new char[strlen(pn) + 1]; //+1은 null문자 포함한 크기 strcpy(name, pn); number = n; } ~Student() { delete[] name; } void setName(const char* pn) { delete[] name; name = new char[strlen(pn) + 1]; strcpy(name, pn); } void print() { cout << "이름: " << name << " "; cout << "학번: " << number << endl; } }; int main() { Student s1("Kim", 2020120147); Student s2(s1); //복사 생성자(default) s1.print(); s2.print(); s1.setName("Park"); s1.print(); s2.print(); return 0; }
실행 결과
[문제점]
복사 생성자에서 새로운 메모리 공간을 할당해서 복사한 것이 아니고, 단순히 포인터의 값(주소값)만 복사되었기 때문
[해결 방안]
깊은 복사
-> 디폴트X, 직접 복사 생성자 구현//깊은 복사(복사 생성자 정의) Student(Student& s) { name = new char[strlen(s.name) + 1]; strcpy(name, s.name); number = s.number; }
위에 구현해놓은 코드에 복사 생성자 정의를 추가하면 됨
실행 결과
'C++ > clone code' 카테고리의 다른 글
[C++] static_member.cpp (0) 2022.06.30 [C++] market.cpp (객체와 클래스에 대한 이해) (0) 2022.06.28 [C++] 계좌 잔액 조회하기.cpp (객체와 클래스에 대한 이해) (0) 2022.06.28 [C++] desk_lamp.cpp (객체와 클래스에 대한 이해) (0) 2022.06.28 [C++] find_max_n_min.cpp 최댓값, 최솟값 구하는 프로그램(배열 활용) (0) 2022.05.23