C++은 함수 호출 시 매개변수 자료형이 안 맞아도 에러를 던지지 않고(경고만 함) 자동 형변환 되고 데이터 손실이 난다.

인라인 함수

inline int add(int a, int b) {
    return a + b;
}

inline 키워드를 사용해 함수를 정의할 수 있다.

inline 키워드를 사용하면 해당 함수가 호출되는 대신 컴파일러가 해당 함수의 코드를 호출 지점에 직접 삽입하려고 시도한다. 이로 인해 호출 오버헤드가 제거되어 실행 시간을 단축할 수 있다.

하지만 코드 크기가 증가한다 그리고 컴파일러에게 인라인으로 처리하도록 제안하는 것으로 수용하지 않을 수도 있다.

매크로 함수

#define SQUARE(x) ((x) * (x))
...

void main(void)
{
	cout << SQUARE(3.5) << endl;
	cout << SQUARE(4.1234) << endl;
	cout << SQUARE(3) << endl;
}

매크로 함수는 자료형에 의존적이지 않은 함수가 되고 어떠한 경우에도 데이터 손실이 발생하지 않는다.

const 의미

const int num = 10; => 변수 num을 상수화

const int* ptr = &val; => 포인터 ptr을 이용해 val의 값을 변경할 수 없음

int* const ptr = &val; => 포인터 ptr이 상수화

const int* const ptr = &val; => 포인터 ptr이 상수화 + ptr을 이용해 val의 값을 변경할 수 없음

참조자를 이용한 Call by reference

void Test(int& ref) { .... };

참조자는 선언과 동시에 변수로 초기화돼야 한다.

하지만 매개변수는 함수가 호출되어야 초기화가 진행되는 변수들이다.

즉 위의 매개변수 선언은 초기화가 이뤄지지 않은 것이 아니라, 함수호출 시 전달되는 인자로 초기화한다는 의미이다.

 

int num = 1;
TestFunc(num);

c라면 void TestFunc(int a) { .... } 으로 num이 바뀔 수 없지만

c++ 이라면 void TestFunc(int& a) { .... } 일 수 있고 num이 바뀔 수도 있다.

그래서 c++ 에서는 함수의 원형을 확인하여 void TestFunc(const int &a) { .... }  다음과 같이 정의되어 있다면 참조자 a를 이용해 값을 변경할 수 없다.

반환형이 참조형인 경우

지역 변수를 참조형으로 반환하는 경우는 없어야 한다.

아직 채 소멸되지 않은 찌꺼기의 형태로 남아있는 데이터를 참조해서 정상적인 출력결과를 보이기도 하니 주의가 필요하다.

int& RetuRefFunc(int n)
{
	int num = 20;
	num += n;
	return num;
}

void main(void)
{
	int& ref = RetuRefFunc(10);
}

위와 같은 상태에서 경고메시지만 띄운다.

지역 변수 또는 임시: num의 주소를 반환하고 있습니다.

임시변수, 상수의 참조, const 참조자

const int& ref = 3;

const 참조자를 사용하면 상수를 참조할 때 임시변수를 만든다. 그리고 이 장소에 상수 3을 저장하고 참조자가 이를 참조하게끔 한다.

int Test(const& int a, const& int b)
{
	return a + b;
}

굳이 임시변수를 만들며 상수의 참조가 가능하게 한 이유는 뭘까? Test(num1, num2)가 아닌 Test(3, 50)과 같은 상수 형태의 호출이 가능하기 때문이라고 하는데

현재 Visual Studio19에서 찍어보면 const 참조자를 쓰지 않아도 상수를 매개변수로 호출이 가능하다.

포인터 연산 없이 힙 영역에 접근

int *ptr = new int;
int &ref = *ptr;
ref = 20;
cout << *ptr; // 20
delete ptr;

+ 풍경