728x90
참조리턴
[ 참조리턴 ]
- C 언어의 함수 리턴 : 함수는 반드시 값만 리턴
- 기본 타입 값 : int, char, double 등
- 포인터 값
- C++ 의 함수 리턴 : 함수는 값 외에 참조리턴 가능
- 참조리턴 : 변수 등과 같이 현존하는 공간에 대한 참조 리턴으로, 변수의 값을 리턴하는 것이 아님
[ 값을 리턴하는 함수 VS 참조를 리턴하는 함수 ]
- 문자 값을 리턴하는 get()
char c ='a';
char get() { // char 리턴
return C; // 변수 c의 문자('a') 리턴
}
char a = get(); // a = 'a'가 됨
get() = 'b'; // 컴파일 오류
- char 타입의 참조(공간)을 리턴하는 find()
char c = 'a';
char& find() { // char 타입의 참조 리턴
return c; // 변수 c에 대한 참조 리턴
}
char a = find(); // a='a'가 됨 > 값을 전달
char &ref = find(); // ref는 c에 대한 참조
ref = 'M'; // c = 'M'
find() = 'b'; // c = 'b'가 됨
{ 예제 5-8 간단한 참조 리턴 사례 }
#include <iostream>
using namespace std;
char& find(char s[], int index) {
return s[index]; // 참조 리턴
}
int main() {
char name[] = "Mike";
cout << name << endl;
find(name, 0) = 'S'; // name[0]='S'로 변경
cout << name << endl;
char& ref = find(name, 2); // ref는 name[2] 참조
ref = 't'; // name = "Site"
cout << name << endl;
}
복사 생성자
[ C++에서 얕은 복사와 깊은 복사 ]
{ 얕은 복사 (swallow copy) } ▶ 컴파일러가 해주는 것
- 객체 복사 시, 객체의 멤버를 1:1로 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우
- 사본은 원본 객체가 할당 받은 메모리를 공유하는 문제 발생
{ 깊은 복사 (deep copy) }
- 객체 복사 시, 객체의 맴버를 1:1로 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우
- 사본은 원본이 가진 메모리 크기만큼 별도로 동적 할당
- 원본의 동적 메모리에 있는 내용을 사본에 복사
- 완전한 형태의 복사
- 사본과 원본은 메모리를 공유하는 문제 없음
{ C++에서 객체의 복사 }
[ 복사 생성자 ]
- 복사 생성자 (copy constructor)란? : 객체의 복사 생성시 호출되는 특별한 생성자
- 특징
- 한 클래스에 오직 한 개만 선언 가능
- 복사 생성자는 보통 생성자와 클래스 내에 중복 선언 가능
- 모양 : 클래스에 대한 참조 매개 변수를 가지는 독특한 생성자
- 복사 생성자 선언
class Circle {
.....
Circle(const Circle& c); // 복사 생성자 선언
.....
};
Circle::Circle(const Circle& c) { // 복사 생성자 구현
......
}
{ 예제 5-9 Circle의 복사 생성자와 객체 복사 }
#include <iostream>
using namespace std;
class Circle {
private:
int radius;
public:
Circle(const Circle& c); // 복사 생성자 선언
Circle() { radius = 1; }
Circle(int radius) { this->radius = radius; }
double getArea() { return 3.14*radius*radius; }
};
Circle::Circle(const Circle& c) { // 복사 생성자 구현
this->radius = c.radius;
cout << "복사 생성자 실행 radius = " << radius << endl;
}
int main() {
Circle src(30); // src 객체의 보통 생성자 호출
Circle dest(src); // dest 객체의 복사 생성자 호출
cout << "원본의 면적 = " << src.getArea() << endl;
cout << "사본의 면적 = " << dest.getArea() << endl;
}
[ 디폴트 복사 생성자 ]
복사 생성자가 선언되어 있지 않은 클래스는 컴파일러가 자동으로 디폴트 복사 생성자를 삽입
함수 중복
[ 함수 중복 ]
- 다양한 이름의 함수가 공존
- 다형성
- C언어에서는 불가능
- function overloading
- 함수 중복이 가능한 범위
- 보통 함수들 사이
- 클래스의 멤버 함수들 사이
- 상속 관계에 있는 기본 클래스와 파생 클래스의 멤버 함수들 사이
- 함수 중복 성공 조건
- 중복된 함수들의 이름 동일
- 중복된 함수들의 매개 변수 타입이 다르거나 개수가 달라야 함
- 리턴 타입은 함수 중복과 무관
{ 함수 중복 성공 사례 }
{ 함수 중복 실패 사례 }
리턴 타입이 다르다고 함수 중복이 성공하는 것은 아님
[ 함수 중복의 편리함 ]
동일한 이름을 사용하면 함수 이름을 구분하여 기억할 필요 없고, 함수 호출을 잘못하는 실수를 줄일 수 있음
[ 생성자 함수 중복 ]
- 생성자 함수 중복 가능
- 생성자 함수 중복 목적 : 객체 생성시, 매개 변수를 통해 다양한 형태의 초깃 값 전달
class string {
....
public:
string(); // 빈 문자열을 가진 스트링 객체 생성
string(char* s); // '\0'로 끝나는 C-스트링 s를 스트링 객체로 생성
string(string& str); // str을 복사한 새로운 스트링 객체 생성
....
};
string str; // 빈 문자열을 가진 스트링 객체
string address("서울시 성북구 삼선동 389")
string copyAddress(address); // address의 문자열을 복사한 별도의 copyAddress 생성
[ 소멸자 함수 중복 ]
- 소멸자 함수 중복 불가
- 소멸자는 매개변수를 가지지 않음
- 한 클래스 내에서 소멸자는 오직 하나만 존재
[ 디폴트 매개 변수 ]
- 디폴트 매개 변수 (default parameter) : 매개 변수에 값이 넘어오지 않는 경우, 디폴트 값을 받도록 선언된 매개 변수
- '매개변수 = 디폴트값' 형태로 선언
- 디폴트 매개 변수 선언 사례
void star(int a = 5); // a의 디폴트 값은 5
- 디폴트 매개 변수를 가진 함수 호출
star(); // a의 디폴트 값은 5
star(10); // 매개 변수 a에 10을 넘겨줌
[ 함수 중복의 모호성 ]
▶ 함수 중복이 모호하여 컴파일러가 어떤 함수를 호출하는지 판단하지 못하는 경우
- 형 변환으로 인한 모호성
- 참조 매개 변수로 인한 모호성
- 디폴트 매개 변수 인한 모호성
728x90
'Programming > C++' 카테고리의 다른 글
[C++ 스터디] 템플릿과 표준 템플릿 라이브러리{STL}_(2) (0) | 2022.12.08 |
---|---|
[C++ 스터디] 템플릿과 표준 템플릿 라이브러리{STL}_(1) (0) | 2022.12.04 |
[C++ 스터디] 상속(1) (1) | 2022.11.27 |
[C++ 스터디] static 멤버 (0) | 2022.11.20 |
[C++ 스터디] 객체 치환 및 객체 리턴 | Vector (0) | 2022.11.06 |