인자안에 들어가는 '클래스& 주소연산자'의 의미는 무엇인가요?

조회수 8589회

아래 코드는 깊은 복사로 대입연산을 하는 코드입니다. 주석 달아놓은 줄을 보시면 Student& operator=(Student& ref) 라고 되어있는데 저렇게도 생성자를 만들 수 있는 건가요? 저건 무슨 의미인가요? 포인터 공부할때 &이 주소값은 반환, 참조하는 거라고 배웠었는데 ... 생성자 바로 옆에 '&변수명(?)'과 그리고 할당 '=', '클래스명& 변수명 ' 을 작성한 것이 무슨 의미인지 모르겠습니다. ㅠㅠ

#include <iostream>
 
using namespace std;
 
class Student
{
private:
    char * name;
    int age;
public:
    Student(char * name, int age) : age(age) // 자주 보아오던 생성자의 형태..(+멤버 이니셜라이저)
    {
        this->name = new char[10];
        strcpy(this->name, name);
    }
    void ShowInfo() {
        cout << "이름: " << name << endl;
        cout << "나이: " << age << endl;
    }
    Student& operator=(Student& ref) // 그러나 이 생성자는 잘 모르겠습니다.
    {
        delete []name;
        name = new char[10];
        strcpy(name, ref.name);
        age = ref.age;
        return *this;
    }
    ~Student()
    {
        delete []name;
        cout << "~Student 소멸자 호출!" << endl;
    }
};
 
int main()
{
    Student st1("김철수", 14);
    Student st2("홍길동", 15);
 
    st2 = st1;
 
    st1.ShowInfo();
    st2.ShowInfo();
    return 0;
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 생성자는 함수명이 없어야 하기에 생성자가 아닙니다.

    연산자 오버로딩을 공부하시면 이해가 되실 겁니다.

    Student& operator=(Student& ref)
    (리턴)       (함수명)      (인자)
    

    를 보시면 operator= 라는 함수 명이있죠? 일반적인 함수입니다.

    operator=라는 함수이며 인자로는 Strudent의 참조형이 들어가고, 리턴으로 Student의 참조에 의한 리턴을 하는겁니다. 마지막에 return *this;로 포인터를 리턴하죠? 그래서 리턴으로 참조형이 있습니다.

    operator[연산] 이런 형식의 함수는 연산자 오버로딩을 할 때 사용합니다.

    +, -, =, <<, 등의 연산자를 덮어서 재정의 할 때 사용합니다.

    main 함수에

     st2 = st1;
    

    코드가 있는데 이를 그냥 수행하면 일반적으로 st1에 있는 변수들이 st2안에 대입이 될 겁니다.

    만약 멤버변수에 포인터 형식이 있으면 똑같이 대입을 하겠지만 포인터의 대입은 단순 참조 이므로 두개의 포인터가 같은 값을 가르키게 됩니다. 이후에 소멸자가 호출 될 때 똑같이 참조하는 값을 날리게 되는데, 이 때 삭제된 값을 삭제하게 되는 문제와 다른 값을 삭제 안함으로 인한 메모리 유출 문제가 있습니다.

    이를 얕은 복사에 의한 문제로 보고 그래서 하는 것이 깊은 복사를 사용하는 것인데,

    여기서 기본으로 주어지는 "=" 연산을 사용하면 얕은 복사가 되기 때문에 이를 덮어씌워 깊은 복사가 되게 재정의 하는 연산자 오버로딩을 사용합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 쉬운 설명 감사합니다! ㅎㅎ 작성하신 첫 번째 코드블럭을 말로 풀어보면 'operator='(함수명) 을 사용할때 'Student& ref' (인자) 를 Student 클래스에서 받아서 'Student& (리턴)' 과 return * this 로부터 Student 클래스로(?) 결과값(자기 자신객체)를 돌려준다. 라고 보면 되는걸까요? 그리고 오퍼레이터 연산자에서 맨 앞에있는 클래스명은 그 클래스로 리턴해준다는 의미인가요? 영어로 따지자면 목적어처럼요.. 알 수 없는 사용자 2016.9.7 09:37
    • Student& ref 는 Student& 형, 다시말해 "Student 클래스형의 참조형인 ref를 인자로 받겠다" 라는 의미이며, 리턴은 *this는 자기 자신이므로 자기 자신을 가르키는 포인터를 리턴하는데, 포인터는 참조형(&)으로 받을 수 있고, 자기 자신은 현재 Student 클래스 이기 때문에 Student&(리턴)는 Student의 참조형으로 리턴한다는 의미입니다. 알 수 없는 사용자 2016.9.7 10:59
    • 쉽게 이야기 하면 int add(int a) 함수는 정수형(int) a를 인자로, 리턴값은 정수형(int)라는 의미잖아요? 이와 같이 본문은 Student의 참조형을 인자로, Student의 참조형을 리턴한다는 의미로 받아들이시면 될 것 같습니다. 알 수 없는 사용자 2016.9.7 10:57

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)