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
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v