C++

·C++
void func(int& x){ x = 20;}int main(){ int a = 0; func(a); // a = 20}void func(int* px){ *px = 20;}int main(){ int a = 0; func(&a); // a = 20} &(reference)참조 변수 x는 main의 a 변수의 별명이 되어 a의 메모리를 공유하게 된다. 즉, 서로 부르는 이름만 다를 뿐이지 같은 주소를 공유한다. *(pointer)px는 int*로 포인터 타입이다. 해당 타입은 지역변수이자 매개변수이다.참조와 다른 큰 특징은 px는 a와 주소가 다르다는 것이다. *px와 *a가 가르키는 값은 같다. 다만, px와 a의 주소는 다르다는 이야기이다.
·C++
Virtual이란 무엇인가?Virtual의 정의는 '가상의' 이라는 의미를 포함한다. 부모를 상속받은 자식 클래스에서 재정의 할 것으로 기대하고 정해놓은 함수라고 이야기한다.그렇다면, 가상함수로 정의한것과 정의하지 않은 것은 명확한 차이를 보일까?컴파일러는 함수를 호출할 때 매우 복잡한 과정을 거치게 됩니다. 그렇기에 컴파일러는 함수를 호출하는 코드는 컴파일 타임에 고정된 메모리 주소로 변환시킵니다. 이것을 정적바인딩이라고 합니다.하지만 일반 함수를 오버 로딩하게 되면 정적바인딩으로 인해 문제가 될 수 있습니다. 가상함수가 아닌 보통의 경우 부모 클래스형 포인터로 멤버 함수를 호출할때, 컴파일러는 정적타입을 보고 이 타입에 맞는 멤버함수를 호출하기 때문입니다.정적바인딩으로 인해(컴파일 당시 호출될 함수의..
·C++
C++에서 &을 이용하여 참조로 전달할 수 있다. 이렇게 되면 데이터를 복사하는 것이 아닌 해당 메모리에 있는 데이터를 그대로 사용하게 된다.참조로 전달하는 것이 재미있는 것은 포인터가 하지 못하는 것을 할 수 있다는 것이다. 포인터를 통해서 주소를 전달하는 것도 데이터 복사를 하지 않는다. 왜냐하면 주소 자체를 전달하는 것이므로 함수에서는 주소를 접근하기 때문이다.하지만, 함수 내에서 해당 주소를 변경하게 되면 기존 파라미터로 전달한 주소는 변경되지 않는다는 점이다.  기존에 한 주소에 두 개의 포인터가 연결되었는데, 그 중 한 포인터가 새로운 주소에 연결되었다고 이해하면 된다.이렇기 때문에 참조가 필요하다. 주소를 전달해서 원본 주소도 변경하고 싶을 때에는 포인터를 참조로 전달하면 되기 때문이다.#i..
Koala Jung
'C++' 카테고리의 글 목록