참조 리턴
C언어의 함수 리턴
- 함수는 반드시 값만 리턴
- 기본 타입 값 : int, char, double 등
- 포인터 값
C++의 함수 리턴
- 함수는 값 외에 참조 리턴 가능
- 참조 리턴
- 변수 등과 같이 현존하는 공간에 대한 참조 리턴
- 변수의 값을 리턴하는 것이 아님.
find()는 값이 아닌 공간을 리턴하기 때문에 'a' 가 아닌 다른 문자를 저장할 수 있다.
name 배열에 M i k e \0으로 저장돼있었는데 find 함수와 ref가 각각 name[0]와 name[2] 위치를 참조해서 다른 문자를 리턴한다.
복사 생성자
1. 얕은 복사 (swallow copy)
- 객체 복사 시, 객체의 멤버를 1:1로 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우
-> 사본은 원본 객체가 할당 받은 메모리를 공유하는 문제가 발생한다.
2. 깊은 복사(deep copy)
- 객체 복사 시, 객체의 멤버를 1:1로 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우
- 사본은 원본이 가진 메모리 크기 만큼 별도로 동적 할당
- 원본의 동적 메모리에 있는 내용을 사본에 복사
- 완전한 형태의 복사 -> 원본과 사본의 메모리 공유 문제 없음.
메모리까지 복사된다.
복사 생성자 : 객체의 복사 생성 시 호출되는 특별한 생성자
- 한 클래스에 오직 한 개만 생성 가능
- 보통 생성자와 클래스 내에 중복 선언 가능
- 클래스에 대한 참조 매개 변수를 갖는 독특한 생성자
class Circlc{
......
Circle(const Circle& c);
...
};
Cirlcle::Circle(const Circle& c){
...
}
Circle의 복사 생성자와 객체 복사
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); //객체의 보통 생성자 호출
Circle dest(src); //dest 객체의 복사 생성자 호출
cout << "원본의 면적 = " << src.getArea() << endl;
cout << "사본의 면적 = " << dest.getArea() << endl;
}
디폴트 복사 생성자
복사 생성자가 선언되어 있지 않는 클래스
- 컴파일러가 자동으로 디폴트 복사 생성자 삽입
묵시적 복사 생성에 의해 복사 생성자가 자동 호출되는 경우
void f(Person person) { //2. 값에 의한 호출로 객체가 전달될 때, person 객체의 복사 생성자 호출
person.changeName("dummy");
}
Person g() {
Person mother(2, "Jane");
return mother; //3. 함수에서 객체를 리턴할 때 mother 객체의 복사본 생성.
// 복사본의 복사 생성자 호출
}
int main() {
Person father(1, "Kitae");
Person son = father; //1. 객체로 초기화하여 객체가 생성될 때, son 객체의 복사 생성자 호출
f(father);
g();
}
함수 중복
-동일한 이름의 함수 공존
- 다형성, C언어는 불가능
- function overloading
- 가능 범위
보통 함수들 사이
클래스의 멤버 함수들 사이
상속 관계에 있는 기본 클래스와 파생 클래스의 멤버함수들 사이
- 함수 중복 성공 조건
중복된 함수들의 이름 동일
매개 변수 타입이 다르거나 개수가 달라야 함
리턴 타입은 함수 중복과 무관함
int sum(int a, int b, int c){
return a + b + c;
}
double sum(double a, double b) { //매개 변수 타입이 다름
return a + b;
}
int sum(int a, int b){ //매개변수 개수가 다름
return a + b;
}
big() 함수 중복 연습
sum() 함수 중복 연습
생성자 함수 중복
- 생성자 함수 중복 가능
- 목적 : 객체 생성시, 매개 변수를 통해 다양한 형태의 초깃값 전달
소멸자 함수 중복 불가
- 매개 변수 X
- 한 클래스 내에서 소멸자는 오직 하나만 존재
디폴트 매개 변수(default parameter)
- 매개 변수에 값이 넘어오지 않는 경우, 디폴트 값을 받도록 선언된 매개 변수
'매개 변수 = 디폴트 값'
void star(int a=5); //a의 디폴트 값은 5
star(); //star(5)와 같다.
- 디폴트 매개 변수는 일반 매개 변수 앞에 선언될 수 없음.
- 디폴트 매개 변수는 끝 쪽에 몰려 선언되어야 함
디폴트 매개 변수를 가진 함수 만들기 연습
'C++' 카테고리의 다른 글
10주차 스터디 (0) | 2022.11.24 |
---|---|
9주차 스터디 (0) | 2022.11.19 |
껄껄껄 7주차 스터디 (0) | 2022.11.05 |
C++ 6주차 과제 2 : 캐릭터 관리 프로그램 (0) | 2022.06.28 |
C++ 6주차 스터디 과제 1 : Template (0) | 2022.06.23 |