'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

자료형

Study/light_C++ 2016.07.24 22:51

C++ 자료형을 정리해보겠습니다.


자료형 

설명 

 long long

 64비트 정수 (컴파일러에 따라 약간 다름)

 char16_t

 16비트 문자 (ex. char16_t a = u'A'; )     //유니코드 처리

 char32_t

 32비트 문자 (ex. char32_t a = u'A'; )     //유니코드 처리

 auto

 컴파일러가 자동으로 형식을 규정하는 자료형 (ex. auto a = 10;)

 decltype(expr)

 expr 과 동일한 자료형 (ex. int x = 10; decltype(x) y = 20; )


저작자 표시
신고

'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. namespace

다중 정의와 범위를 지정해서 체계적으로 코드로 관리할 수 있게 하는 것.


2. default 매개 변수

기본값을 정해서 함수 이름만 쓰고 함수를 실행한다.


3. 다중 정의

이름은 같으나 내맘대로 자료형을 바꿔도 된다.


4. 네임스페이스

내가 원하는 함수, 변수 등에 소속감 주기


 2.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
#include "stdafx.h"
#include <iostream>
 
//nParam 매개변수의 디폴트 값은 10
int TestFunc(int nParam = 10)
{    
    return nParam;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
 

    std::cout << TestFunc() << std::endl;

  
std::cout 
<< TestFunc(20<< std::endl;
    
}
cs


결과는  10,20


매개변수의 디폴트 값을 선언한 함수는 호출자 코드에서 실인수를 생략한 채 호출할 수 있습니다.

매개변수의 디포트 값은 반드시 함수 원형의 선언부분에 기술해야 한다!!



저작자 표시
신고

'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