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;
+ 풍경
'Language > C,C++' 카테고리의 다른 글
C++, C# 에서 값 타입을 참조로 전달하는 방법 (0) | 2024.07.07 |
---|---|
c++ 객체 반환, 포인터 관리, 스마트 포인터 (0) | 2024.04.23 |
윈도우10 Qt6/ Qt Creator13/ Opencv4.9 연동, 설정 (0) | 2024.04.15 |
c++ inline compile (0) | 2024.04.08 |