|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 = 5, int c); // 컴파일 오류 void funct(int a = 0, int 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| 함수 중복의 모호성
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 멤버
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; 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 |