C++

8주차 스터디

kchabin 2022. 11. 13. 02:22

참조 리턴

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