'Study/light_C++'에 해당하는 글 5건

C++ 에서 "다중 정의"는 하나(함수 이름, 변수 이름) 에 여러 의미를 동시에 갖는 것입니다.

영어로 "Overloading" [오버로딩] 라고 합니다.


C에서 이름이 같은 함수는 쓰면 않됩니다. C++에서는 매개변수 구성이 달라지거나 함수 원형이 달라지면

이름이 같더라도 다른 함수가 됩니다.


C++는 함수의 "다형성" 을 지원합니다.


예제 1) 다중 정의 일반



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
27
28
29
30
31
32
33
34
35
36
#include "stdafx.h"
#include <iostream>
 
int Add(int a, int b, int c)
{  
    std::cout << "Add(int, int, int); ";    
    return a + b + c;
 
}
 
int Add(int a, int b)
{    
    std::cout << "Add(int, int); ";    
    return a + b;
 
}
 
double Add(double a, double b)
{    
    std::cout << "Add(double , double) ";    
    return a + b;
 
}
 
int _tmain(int argc, _TCHAR* argv[])
{    
    std::cout << Add(34<< std::endl;    
    std::cout << Add(345<< std::endl;    
    std::cout << Add(3.34.4<< std::endl;    
 
    return 0;
 
}
 
cs


자료형에 따라 연산 결과가 나오게 됨을 알 수 있습니다.  어려운 내용이 아니므로 넘어갑니다.


예제 2) C Style  함수 원형


*함수 원형 구성


반환형식 호출규칙 함수이름(매개변수, 매개변수, *** );


1
2
3
4
5
6
7
8
9
10
11
12
13
14

#
include
 "stdafx.h"
#include <iostream>
 
int Add(int a, int b);    
double Add(double a, double b);
 
int _tmain(int argc, _TCHAR* argv
{
   Add(34);    
   Add(3.34.4);    
   
   return 0;
 
}
cs


컴파일 하면 어떻게 될까요? 




링크에러네요.  이유가 뭘까요??  같은 함수 지만 반환 값이 다르죠..


여기서 Add함수는 예명입니다. 본명은 파란 부분입니다.

컴파일러에서는 이름이 중복되니깐 에러로 보는 겁니다.


C++에서 int __cdecl Add(int,int) 함수의 이름이  (?Add@@YAHHH@Z) 바뀝니다.

double __cdecl Add(double,double)  (?Add@@YANNN@Z)

이런 것을 name mangling 입니다. 


C++  컴파일러가 로 바꿉니다.  C언어 처럼 중복이 없는 거죠.


위의 예제를 C 언어로 바꿀려면 이렇게 할 수 있습니다.


컴파일 할 때 문제가 생깁니다. 

오류    C2733    'Add': 오버로드된 함수의 두 번째 C 링크는 허용되지 않습니다.    


C언어는 변수 이름을 중복해서 쓰지 않습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <iostream>
 
extern "C"
{
  int Add(int a, int b);    
  double Add(double a, double b);
 
}
 
int _tmain(int argc, _TCHAR* argv
{
   Add(34);    
   Add(3.34.4);    
   
   return 0;
 
}
cs




저작자 표시
신고

'Study > light_C++' 카테고리의 다른 글

ch2-4 함수 다중 정의  (0) 2016.09.07
ch2-3 함수 템플릿  (0) 2016.09.07
New 와 delete 연산자  (0) 2016.07.24
자료형  (0) 2016.07.24
Chap 2. C++ 함수와 네임스페이스  (0) 2016.06.27

WRITTEN BY
Profile
비타오백
Enjoy your stage!

받은 트랙백이 없고 , 댓글이 없습니다.
secret

함수를 다중 정의하는 이유는 사용자의 편의성과 확장성을 위한 것입니다. 함수를 여러번 쓰면 귀찮고 번거로울 수 있습니다.

프로그램의 유지보수를 생각하면, 함수가 여러개를 고치는 일은 비효율적입니다.

이를 위해 함수 다중 정의 보다 '함수 템플릿' [Template] 을 사용하는 것이 좋습니다.

형식은 다음과 같습니다.

template <typename T>

반환형식 함수이름(매개변수)

{

}

template <자료형 자료형> 입니다.


C++ 템플릿은 함수와 클래스에 사용할 수 있습니다. 자료형을 가져올 수 있기 때문에

여러번 호출 할 수 있습니다.






예제 코드를 봅시다.  호출된 함수안에 대입된 값으로 자료형을 파악할 수 있습니다.

Add(3 , 4 ) 에서 3이면 integer 입니다.  Add(3.3 , 4.4)에서 3.3 이면 double 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <iostream>
 
template <typename T>
T Add(T a, T b)
{
  return a + b;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
  std::cout << Add(34<< std::endl;
  //std::cout << Add<int>(3, 4) <<std::endl;

  std::cout << Add(3.34.4<< std::endl;
 
  return 0;
 
}

cs



저작자 표시
신고

'Study > light_C++' 카테고리의 다른 글

ch2-4 함수 다중 정의  (0) 2016.09.07
ch2-3 함수 템플릿  (0) 2016.09.07
New 와 delete 연산자  (0) 2016.07.24
자료형  (0) 2016.07.24
Chap 2. C++ 함수와 네임스페이스  (0) 2016.06.27

WRITTEN BY
Profile
비타오백
Enjoy your stage!

받은 트랙백이 없고 , 댓글이 없습니다.
secret

1. 배열이 아니고 자료형 일 때

형식 * 변수이름 = new 형식;

delete 변수이름;



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{    
 
  int *pData = new int;     

   int *pNewData = new int(50);    

  *pData = 100;    
 
  std::cout << *pData << std::endl;    
  std::cout << *pNewData << std::endl;    
 
  delete pData;    
  delete pNewData;
 
}
cs





2. 배열형태


형식 * 변수이름 = new 형식[요소개수];

delete[ ]  변수이름;


malloc의 코드는 이렇습니다..


int *p = (int*)malloc( sizeof(int) * n);       //메모리 크기를 설정

free(p);


굳이 메모리 크기를 정해서 하는 것 보다

new 연산자를 쓰면 훨씬 편합니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{    
int *arr = new int[5];   //20byte    
    
    for (int i = 0 ; i < 5 ; ++i )    
      arr[i] = (i + 1* 10;     
    
    for(int i = 0 ; i < 5 ; ++i )            
       cout << arr[i] << endl;    
     
    
    delete[] arr;    
    
    return 0;
 
}
cs


갑자기 궁금해졌음  ++i i++ 뭔차이인지??


++i는 i를 바로 증가시켜서 반환하지만
i++은 임시변수를 만들어서 i를 대입하고 i를 증가시키고 임시변수를 반환하는 형식이었어요.

++ i 가 연산속도가 빠르다.


저작자 표시
신고

'Study > light_C++' 카테고리의 다른 글

ch2-4 함수 다중 정의  (0) 2016.09.07
ch2-3 함수 템플릿  (0) 2016.09.07
New 와 delete 연산자  (0) 2016.07.24
자료형  (0) 2016.07.24
Chap 2. C++ 함수와 네임스페이스  (0) 2016.06.27

WRITTEN BY
Profile
비타오백
Enjoy your stage!

받은 트랙백이 없고 , 댓글이 없습니다.
secret