티스토리 뷰

인자 전달 방식

1. 값에 의한 호출, call by value

* 함수가 호출되면 매개 변수가 스택에 생성됨

* 호출하는 코드에서 값을 넘겨줌

* 호출하는 코드에서 넘어온 값이 매개 변수에 복사됨


2. 주소에 의한 호출, call by address

* 함수의 매개 변수는 포인터 타입

* 호출하는 코드에서는 명시적으로 주소를 넘겨 받음

* 호출하는 코드에서 넘어온 주소값이 매개 변수에 저장



참조보녓 사용법과 선언시 주의사항


refn = 3;

n = 5;

refn++;


초기화가 없으면 컴파일 오류

int n = 2;

int &refn;


참조변수는 배열을 만들 수 없다.



void square(int n) {

 n = n + n;

}

int main() {

 int m=2;

 square(&m);

 cout << m ;

}



 C 언어의 함수 리턴
* 함수는 반드시 값만 리턴
 * 기본 타입 값 : int, char, double 등
 * 포인터 값
 C++의 함수 리턴
 * 함수는 값 외에 참조 리턴 가능
 * 참조 리턴
 * 변수 등과 같이 현존하는 공간에 대한 참조 리턴

객체복사개념

디폴트 복사 생성자

class a {
...
}

a 안에 복사생성자를 정의 하여 두지 않아도
컴파일러는 기본으로 복사생성자를 가지고 있다
디폴트 복사 생성자의 원형은

a(a& b){
...
}

인데 b는 a클래스의 객체이며 내용으로는 this->j = j;
이런식으로 a클래스에 있는 인스턴스 변수가 복사되는 형식이다.

깊은 복사 생성자 할당 방법

깊은 복사 생성자란 얉은 복사 생성자에 오류를 개선한 방법으로
얉은 복사 생성자를 사용했을땐 참조 위치가 동일하여서 메모리를 해제시 복사한 클래스가 해제 되었을때 실제 클래스가 가리키는 주소가 없어서 오류가 나는것을 개선한 것 이다.

깊은 복사 생성자는

a(a& b){
...
}

형태의 복사 함수가 있을시 복사를 하려는 곳의 참조메모리 영역을 새롭게 만들어서 복사하는 것 이다
그러면 메모리를 해제 하여도 실제 함수의 원형이 가리키는 메모리 영역은 살아 있기 때문에 컴파일시 오류가 나지 않는다.


Person::Person(Person& person) { // 복사 생성자
this->id = person.id; // id 값 복사
int len = strlen(person.name);// name의 문자 개수    
this->name = new char [len+1]; // name을 위한 공간 핟당
strcpy(this->name, person.name); // name의 문자열 복사
}

this->name = new char[len+1]; 이부분에서 메모리를 할당 받아 문자열을 복사하였다. 
이런식으로 메모리를 새롭게 할당받아 복사하는 방법이 깊은 복사 방법이다.




'IT > C++' 카테고리의 다른 글

[C++] 함수 중복과 static 멤버  (0) 2014.11.12
[C++] String Class  (0) 2014.11.06
[C++] 배열과 객체의 동적 할당  (2) 2014.10.29
[C++] 계산기 예제  (0) 2014.10.08
[C++] 생성자 소멸자 응용 프로그램  (0) 2014.10.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함