(C++)5장 함수

1.1 함수 바로 알기
---
함수의 구성요소: 반환값 함수명 (매개변수목록)
#include<iostream>
using namespace std;

class Chulsoo
{
 public:
   void eat();

};

void Chulsoo::eat()
{
 cout<<"철수가 먹는다"<<endl;
}
int main(void)
{
 Chulsoo chulsoo;
 chulsoo.eat();
return 0;
}


2. 함수 선언과 정의 그리고 노출

클래스 변수와 클래스 멤버함수는 사용전에 선언이 되어야 한다.

2.1 함수선언

-->함수선언은 컴파일러가 함수를 처리하려고 할 때, 다음사항들을 점검하므로 필요하다.
**컴파일러는 함수 선언을 보고 반환값의 자료형이 무엇인지 안다.
**컴파일러는 함수 선언을 보고 매개변수의 개수가 올바른지 확인한다.
**컴파일러는 함수 선언을 보고 매개변수의 자료형이 올바른지 확인 한다.



3. 값에 의한 호출과 참조에 의한 호출

함수를 호출할떄 전달한 인자는 매개변수를초기화하는데 사용한다. 매개변수 초기화는 일반변수의 초기화와 유사한 방식으로 동작한다. 보통 함수를 호출 할 때, 인자를 전달하는 방식에 따라 값에 의한 호출(call by value)과 참조에 의한 호출(call by reference)로 구분한다.

3.1 값에 의한 호출 방식
--복사의 개념과 같다.

예제)
#include<iostream>
using namespace std;

class Restaurant
{
 public:
 int Steak;
};

class Chulsoo
{
 public:
  int Eat(int);
};

int Chulsoo::Eat(int SteakNum)
{
 SteakNum=10000;
 cout<<"철수는 먹는다"<<endl;
 return SteakNum;
}
int main(void)
{
 Chulsoo chulsoo;
 Restaurant restaurant;

 restaurant.Steak=2000;

cout<<"철수는"<<chulsoo.Eat(restaurant.Steak)<<"를 먹는다"<<endl;
return 0;

}


3.2 참조에 의한 호출 방식
주솟값을 이용한다는 주소에 의한 호출방시과 유사하다.
#include<iostream>
using namespace std;

class Restaurant
{
 public:
  int Steak;
}

class Chulsoo
{
  public:
    int Eat(int&);
}

int Chulsoo::Eat(int &SteakNum)
{
 SteakNum=10000;
 cout<<"철수는 먹는다"<<endl;
 return SteakNum;
}

int main(void)
{
 Chulsoo chulsoo;
 Restaurant restaurant;

 restaurant.Steak=20000;
 chulsoo.Eat(restaurant.Steak);
}


4. 디폴트 매개 변수

항상 넣어줘야 되는 값이 귀찮아 질 때가 있다.
예를들어, 철수가 먹는 기본 스테이크 가격이 항상 20000원 이라고 하자. 이를 프로그래밍 하면 철수가 스테이크를 먹을 때마다 chulsoo.Eat(20000)처럼 계속 20000원 짜리를 먹는다고 인자를 넘겨 줘야한다.

**지정하는 위치

#include<iostream>
using namespace std;

class Chulsoo
{
 public:
  int Eat(int SteakNum);
}

int main(void)
{
 Chulsoo chulsoo;
 chulsoo.Eat();
 return 0;
}

int Chulsoo::Eat(int SteakNum=20000)
{
 return SteakNum;
}


------>컴파일 오류 발생한다

함수정의부에서도 똑같이 해주어야 한다.
즉 int Eat(int SteakNum=20000);


4.2 디폴트 매개변수 여러개 사용하기

class Chulsoo
{
 public:
  int Eat(int SteakNum=20000,int WaterNum=1000,int CoffeeNum=5000);
};

int main(void)
{
 Chulsoo chulsoo;
 chulsoo.Eat();
 chulsoo.Eat(30000); //스테이크 가격이 3만으로 바뀜
 chulsoo.Eat(1500);  //스테이크가격이 1500으로 바뀜
 chulsoo.Eat(2000,1500); //스테이크 가격 2000 물 가격 1500
}


5. 함수오버로팅
*******C에서는 같은 함수 이름을 사용하면 오류가 발새안다.
객체지향의 특징 중 하나인 다형성이라는 개념과 일맥상통한다.

class Chulsoo
{
 public:
  void Eat(int SteakNum);
  void Eat(void);
  void Eat(double SteakWeight);
  void Eat(int SteakNum1,int SteakNum2);

}

class Chulsoo
{
 public:
  void Eat(int SteakNum);
  int Eat(int SteakNum);
  double Eat(double SteakWeight);
  int Eat(int SteakNum1,int SteakNum2);
  double Eat(int SteakNum1,int SteakNum2);
//바로 위 2개는 오류가 발생한다.
매개변수는 무조건 달라야하는 것이 함수 오버로딩이다.

}

댓글

이 블로그의 인기 게시물

(18장) WebSocekt과 STOMP를 사용하여 메시징하기

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬