728x90
728x90
C와 다르게 C++이 가지는 특성
C++은 함수오버로딩이 가능하지만 C에서는 함수의 이름이 같으면 컴파일 오류가 발생한다.
C는 함수의 이름정보만 갖고 찾고,
C++은 함수이름, 매개변수의 선언을 갖고 함수를 찾기 때문이다.
함수 오버로딩 : 같은이름의 함수를 중복해 사용하기
매개변수의 선언형태가 다르면 같은이름의 함수정의 허용
함수호출 시 전달되는 인자를 통해 호출하고자 하는 함수를 구분(갯수, 자료형(타입))
void MyFunc();
int MyFunc();
* 반환형으로는 호출 함수를 구분 못함. 컴파일 오류
#include <iostream>
void MyFunc(void)
{
std::cout<<"MyFunc(void) called"<<std::endl;
}
void MyFunc(char c)
{
std::cout<<"MyFunc(char c) called"<<std::endl;
}
void MyFunc(int a, int b)
{
std::cout<<"MyFunc(int a, int b) called"<<std::endl;
}
int main(void)
{
MyFunc();
MyFunc('A');
MyFunc(12, 13);
return 0;
}
// 동작하지는 않는 이해를 위한 예시
auto* temp = new temp[1000];
temp[0] = (int)10;
temp[1] = (double)10.0;
for(int i = 0; i< 1000 i++ )
{
swap(temp[i], temp[i]);
}
// 이렇게 쓰기보다 위에 반복문으로 한번에 처리
swap(temp[0], temp[0]);
swap(temp[1], temp[1]);
swap(temp[0], temp[0]);
swap(temp[1], temp[1]);
swap(temp[0], temp[0]);
swap(temp[1], temp[1]);
swap(temp[0], temp[0]);
swap(temp[1], temp[1]);
문제 01-2 : 다음 main 함수에서 필요로 하는 swap 함수를 오버로딩 해서 구현해보자.
* swap : 바꾸다. 즉 두 변수의 값을 교환하는 함수. 교환하기 위해서는 중간에 임시 변수가 필요하다.
급하게 본 포인터와 주소 연산자(&), 역참조 연산자(*)
#include <iostream>
void swap(int *a, int *b)
{
// 역참조 연산자 사용
// 받아온 주소값을 역참조하여
// 특정 주소에서 값에 접근한다
int temp = *a;
*a=*b;
*b=temp;
//std::cout<<a<<' '<<b<<std::endl;
}
void swap(char *a, char *b)
{
char temp = *a;
*a=*b;
*b=temp;
}
void swap(double *a, double *b)
{
double temp = *a;
*a=*b;
*b=temp;
}
int main(void)
{
int num1=20, num2=30;
swap(&num1, &num2); //메모리 주소값을 보냄
std::cout<<num1<<' '<<num2<<std::endl;
char ch1='A', ch2='Z';
// error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
//쌍따옴표는 여러개를 표현하는 용이라 오류 발생. 한글자는 홑따옴표 사용
// %c 같은 경우 쌍따옴표를 사용
swap(&ch1, &ch2);
std::cout<<ch1<<' '<<ch2<<std::endl;
double dbl1=1.111, dbl2=5.555;
swap(&dbl1, &dbl2);
std::cout<<dbl1<<' '<<dbl2<<std::endl;
return 0;
}
더보기
#include <iostream>
using namespace std;
template <typename T>
void Swap(T *a, T *b);
int main(void) {
int num1=20, num2=30;
Swap(&num1, &num2); //메모리 주소값을 보냄
std::cout<<num1<<' '<<num2<<std::endl;
char ch1='A', ch2='Z';
Swap(&ch1, &ch2);
std::cout<<ch1<<' '<<ch2<<std::endl;
double dbl1=1.111, dbl2=5.555;
Swap(&dbl1, &dbl2);
std::cout<<dbl1<<' '<<dbl2<<std::endl;
return 0;
}
template <typename T>
void Swap(T *a, T *b)
{
T temp;
temp = *a;
*a = *b;
*b = temp;
}
포인터 변수의 자료형은 가리키는 변수의 자료형과 같아야한다.
포인터는 메모리 주소만 보유할 수 있다. 아래처럼 정수 리터럴을 넣으면 메모리 주소가 없어 컴파일 오류가 발생한다.
int *ptr = 5;
// 틀린 코드
근데 C++에서는 포인터에 리터럴 메모리 주소는 직접 할당할 수 없다. 정수 리터럴을 넣는 것과 같게 생각해서
double *dPtr = 0x0012FF7c;
//틀린 코드
포인터 변수가 있다면 역참조 연산자 * 를 통해 포인터가 가리키는 주소값을 알 수 있다.
포인터의 자료형과 변수 자료형이 다르면 역참조시 비트를 다른 자료형으로 잘못 해석한다.
int value = 5;
int *ptr = &value;
std::cout << ptr; // value 메모리주소 0012..어쩌고
std::cout << *ptr; // ptr을 역참조(ptr이 가리키는 주소의 값 =value) 5
*ptr은 value와 같게 취급, 변수처럼 값을 할당할 수 있다.
int value = 5;
int *ptr = &value;
*ptr = 7; // 이게 가능하다.
std::cout << value; //7로 변경
728x90
728x90
'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글
02-1 챕터 02의 시작에 앞서 (0) | 2021.08.19 |
---|---|
01-5 이름공간 (0) | 2021.08.19 |
01-4 인라인 함수 (0) | 2021.08.18 |
01-3 매개변수의 디폴트 값 (0) | 2021.08.18 |
[윤성우 열혈 c++] 01-1 printf, scanf를 대신하는 입출력 (0) | 2021.08.17 |