|6.1| 함수 중복



※ 중복 함수 조건  


1) 함수 이름 동일

2) 매개 변수 타입 or 개수 달라야 함


but!  return 타입은 고려되지 않음



※ 이미 생성자 함수 중복으로 함수 중복을 해본 바 있음


※ string 클래스 또한 다양한 생성자를 제공함


1
2
3
4
5
string str; // 빈 문자열을 가진 객체
string address("Hermine Portejoie");
string copyname(frenchkebab); /* string객체인 frenchkebab의 문자열을 복사한
                              별도의 copyname객체 생성*/
 
cs



|6.2| 디폴트 매개 변수


※ 조건


1) 디폴트 매개 변수에 값을 전달하는 것은 선택 사항이지만, 일반 매개 변수는 반드시 값을 전달해야 한다.


2) 디폴트 매개 변수는 오른쪽 끝에 몰려 선언되어야 한다.


1
2
void func(int a, int b = 5int c); // 컴파일 오류
void funct(int a = 0int b); // 컴파일 오류
cs



※ 예시 : 디폴트 매개 변수의 원형 선언과 구현을 분리


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
#include <iostream>
#include <string>
using namespace std;
 
// 원형 선언
void star(int a=5);
void msg(int id, string text="");
 
// 함수 구현
void star(int a) {
    for(int i=0; i<a; i++cout << '*';
    cout << endl;
}
 
void msg(int id, string text) {
    cout << id << ' ' << text << endl;
}
 
int main() {
    star(); // star(5);와 동일
    star(10);
 
    msg(10); // star(10, "");과 동일
    msg(10"Hello");
}
 
cs


※ 디폴트 매개 변수의 장점 : 함수 중복을 간소화 할 수 있다.



1
2
3
4
5
6
7
class Circle {
    .........
public:
    Circle() { radius = 1; }
    Circle(int r) { radius = r; }
    ............
};
cs

얘를


1
2
3
4
5
class Circle {
    .........
public:
    Circle(int r = 1) { radius = r; }
};
cs

이렇게 간소화 할 수 있다.




|6.3| 함수 중복의 모호성


※ 함수 중복으로 인한 모호성 3가지

1) 형 변환으로 인해
2) 참조 매개 변수로 인해
3) 디폴트 매개 변수로 인해



1) 형 변환으로 인한 모호성


1
2
3
double square(double a);
....
square(3); // double 타입 매개 변수에 int 타입 전달 but 오류 X
cs


※ 형 변환 참조 => '여기'


but!


1
2
float square(float a);
double square(double a);
cs


이렇게 2개의 중복된 함수가 있을 경우


1
square(3); // float? double? => 컴파일 오류 
cs


이렇게 컴파일러가 오류를 발생시킨다.



※ 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
float square(float a) {
    return a*a;
}
 
double square(double a) {
    return a*a;
}
 
int main() {
    cout << square(3.0); // square(double a); 호출
    cout << square(3); // 중복된 함수에 대한 모호한 호출로서, 컴파일 오류
}
cs


※ 성돈tip : 실수 default가 double이므로, 3.0f 로 입력해야 float값으로 들어간다.



2) 참조 매개 변수로 인한 모호성



1
2
3
4
5
int add(int a, int b);
int add(int a, int &b);
 
int s = 10, t = 20;
add(s, t); // 컴파일 오류
cs



3) 디폴트 매개 변수로 인한 모호성


1
2
3
4
void msg(int id)
void msg(int id, string s = "")
 
msg(6); // 컴파일 
cs








|6.4| static 멤버


● static의 특성


- 생명주기 : 프로그램이 시작할 때 생성, 종료할 때 소멸

- 사용 범위 : global or local




※ non-static 멤버와 구별
: non-static 멤버는 객체가 생성될 때 각 객체마다 개별적으로 생성된다. ( 객체와 생명 주기를 같이 한다. )
 하지만 static 멤버는 객체가 생기기 이전에 이미 생성되어 있고, 객체가 사라져도 소멸되지 않고, 모든 객체들의 공통된 멤버로서 공유된다.
 -> static 멤버는 클래스 당 하나만 생기고 모든 객체들이 공유한다.(class 멤버 라고도 부른다. )

● static 멤버 선언


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Person {
public:
    double money; // 개인 소유의 돈
    void addMoney(int money) {
        this->money += money;
    }
 
    static int sharedMoney; // 공금
    static void addShared(int n) {
        sharedMoney += n;
    }
 
};
 
int Person::sharedMoney = 10; // 반드시 전역 공간에 선언한다
cs


※ static 멤버 변수는 외부에 전역 변수로 선언되어야 한다.



● static 멤버 사용 : 객체의 멤버로 접근하는 방법


:  객체 이름 or 객체 포인터 사용


1
2
3
4
5
6
Person lee;
lee.sharedMoney = 500// 객체 이름으로 접근
 
Person *p;
= &lee;
p->addShared(200); // 객체 포인터로 접근
cs




● static 멤버 사용 : 클래스명과 범위지정 연산자(::)로 접근하는 방법


1
2
Person::sharedMoney = 200// 클래스명으로 접근
Person::addShared(200);
cs


참고로,


1
2
3
4
5
6
7
8
Person::sharedMoney = 200;
hermine.sharedMoney = 200// 위와 동일한 표현
 
 
Person::addShared(200);
junghyun.addShared(200); // 위와 동일한 표현
cs



※ 당연하지만 non-static 멤버는 클래스명으로 접근할 수 없다.


Person 객체가 하나도 안생겼을 때에도 static 멤버를 접근하여 사용할 수 있다.




● static의 활용



1) 전역 변수나 전역 함수를 클래스에 캡슐화


1
2
int abs(int a) { return a > 0 ? a : -1; }
int max(int a, int b) { return (a > b) ? a : b; } 
cs


=> 클래스로 캡슐화되어 있지 않고 전역 함수들이 존재하는 좋지 않은 코드 사례이다.



2) 객체 사이에 공유 변수를 만들고자 할 때 


: 당연함. 



※ static 멤버 함수는 오직 static 멤버들만 접근이 가능하다

-> 당연한 것이, 아직 생기지도 안은 객체의 non-static 멤버에 접근한다는 것이 말이 안된다.


※ 하지만 non-static 멤버 함수는 static 멤버를 접근하는데 전혀 문제가 되지 않는다

-> 이것도 당연한 것이 static멤버는 이미 생성되어 있기 때문이다.

his를 사용할 수 없다.

※ static 멤버 함수는 t

-> static 멤버 함수는 객체가 생기기 전부터 호출 가능하므로 this를 사용할 수 없다.

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

#8-1 상속  (0) 2018.10.07
#7-B 연산자 중복  (0) 2018.10.07
#07-A 프렌드  (0) 2018.10.05
#5-B 복사 생성자  (0) 2018.10.05
#5-A 함수와 참조  (0) 2018.10.04