객체지향프로그래밍-5장

SJ·2024년 4월 5일
0

C++

목록 보기
4/5

참조

-참조 변수란 이미 선언된 변수에 대한 별명이다.
-선언할 때 반드시 누구에 대한 별명인지 명시(선언하면서 초기화 해야 함)
-포인터랑 동일한 점 : 원본 변수에 접근 가능하다. 참조 변수의 값을 바꾸면 원본 변수의 값도 바뀐다.
-포인터랑 다른 점 : 사용방법. 포인터는 원본에 접근할 때 사용방법이 복잡한데, 참조는 쉽다. 그냥 변수처럼 쓰면 되니까

함수의 인자 전달 방식

call by value

함수 내에 독립된 매개변수 공간에 복사됨

call by address

실인자의 주소값이 포인터 타입의 매개변수에 전달됨 : 원본에 접근할 수 있다

call by reference

함수의 매개변수가 참조변수임 : 함수의 매개변수를 참조 타입으로 선언!
매개 변수가 함수를 호출하는 쪽의 실인자를 참조한다.

참조 리턴

-리턴 타입이 참조인 것. (변수 등과 같이) 현존하는 공간에 대한 참조를 리턴
예를 들어서
char c='a'; //c는 전역 변수
char& find(){
return c //c를 가리키는 공간이 리턴
}
int main(){
char ch=find(); //ch='a'
char &ref=find(); //간으함. ref라는 것은 c에 대한 참조가 된다.
ref='M' // c = 'M' 과 동일하다
find()='b' //find() 자체를 참조 변수라고 생각할수도 있어서, 이건 c='b'가 된다.

복사 생성자

-한 객체의 내용을 다른 객체로 복사하여 생성된 생성자
(그냥 일반적으로 생성된 생성자와 같은데 그 내용이 다른 객체를 복사하여 생성된 것으로 이해하면 됨)
-자신과 같은 타입의 객체를 인자로 받는다
-복사 생성자가 정의되어 있지 않다면, 디폴트 복사 생성자가 생성된다.
-객체가 자신과 같은 타입의 다른 객체로부터 초기화될 때 사용된다.
-class에 오브젝트를 전달하면, 오브젝트의 생성자가 전달? -> X, 복사 생성자!
-아래는 복사 생성자의 기본적인 코드 형식임(반환형을 레퍼런스 타입으로 선언)
-객체의 경우 일반적으로 차지하는 메모리가 크기 때문에 기존 객체를 매개 변수에 복사하는 과정은 비효율적이어서!
-const 타입으로 선언된 변수는 이후에 객체의 값을 변경할 수 없고 읽기만 가능하다.
즉, 함수의 매개변수를 const 타입으로 선언한다는 것은 그 매개변수가 함수 내에서 값이 변경되지 않고 읽기만 가능하도록 한 것을 의미한다.
-즉, 복사 생성자의 인자로 들어오는 복사할 객체는 생성자 내에서 값을 변경할 일이 없고 읽기의 기능만을 수행하도록 하는 것이다.

class Name{
	Name(const Name &c); //복사 생성자
}

-객체를 다른 객체로 직접 초기화하는 경우
ex)

MyClass obj1; //그냥 오브젝트 생성
MyClass obj2=obj1; //복사 생성자

-또한 함수에 객체를 값으로 전달, 반환 할때는 복사하는 과정이므로, 복사 생성자가 불린다!
-객체의 멤버 변수에 동적 메모리가 할당된 경우 문제가 발생할 수 있어서, 깊은 복사를 해주어야 한다.
-깊은 복사란 동적할당까지 고려하여 동적 메모리 공간을 복사하는 것임
-디폴트 복사 생성자는 "얕은 복사"를 수행함.
-필드에 동적 할당을 받아 초기화되는 변수가 있다면 사용자가 복사 생성자를 직접 정의하여 깊은 복사가 일어나도록 해야 한다!

0개의 댓글