1. 기본값
함수 선언시 아래와 같이 기본값(default values)을 명시할 수 있다.
단, 기본값은 반드시 함수 선언의 우측 부분에 놓여야 한다. 그렇지 않으면 인자들이 전달될 순서를 명시할 방법이 없다.
그래서 main() 함수에서 func() 함수를 호출 할 때
13번 라인과 같이 인자를 하나만 전달하면, a에 대입되고,
14번 라인과 같이 인자를 두개 전달 하면, a와 b에 각각 초기화 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> using namespace std; int func(int a, int b = 3){ int x = a; int y = b; return x+y; } int main(){ cout<< func(4) << endl; cout<< func(4, 5) <<endl; return 0; } | cs |
실행결과
2. 연산자 오버로딩
연산자 오버로딩(operator overloading) 기능을 사용하면 +와 같은 연산자를 객체간 연산에도 사용할 수 있다.
가령 두 개의 BookShelf 객체를 하나로 합치고 싶을때, +연산자를 다음과 같이 오버로딩하면 된다.
BookShelf BookShelf::operator+(BookShelf &other){ ... }
3. 포인터와 참조
1. 포인터(pointer) : 주소를 담는 변수. 변수의 값을 읽거나 변경하는 등을 할 수 있다.
면접관이 포인터의 메모리에관해 물어본다면, 아키텍쳐의 크기에 따라 달라질 수 있는것을 고려해야한다.
32비트의 경우 포인터는 4bytes, 64비트의 경우 포인터는 8bytes가 된다.
2. 참조(reference) : 기존에 존재하는 객체에 붙는 또 다른 이름이며, 별도의 메모리를 갖지 않는다.
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> using namespace std; int main(){ int a=5; int &b = a; b = 7; cout<<a<<endl; return 0; } | cs |
위의 코드를 보면 7번 라인에서 b는 a의 참조로 선언되었다. 따라서 b를 변경하면 a도 바뀐다.
참조 변수는 상수를 참조할 수 없다.
상수는 임시적으로 존재하는 값이다. 다음행으로 넘어가면 존재하지 않는다.
아래의 코드에서 b는 12를 참조하는데, 숫자 12를 참조할 주소가 없으므로 에러가 난다.
1 | int &b = 12; | cs |
따라서 참조와 동시에 초기화를 하기 위해서는 12라는 숫자가 메모리 상에 존재해야한다.
이를 위해 const변수로 설정을 해 주는데, const를 붙여주면 임시변수라는것을 만들어 그 임시변수에 12를 저장하여 b는 임시변수를 참조하게 된다.
1 2 3 | /* 12를 저장하기 위한 메모리를 할당하고, b가 해당 메모리를 참조하도록 한다.*/ const int &b = 12; | cs |
포인터와 달리 참조는 null이 될 수 없으며, 다른 메모리에 재할당될 수도 없다.
3. 포인터 연산
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream> using namespace std; int main(){ int *p = new int[2]; p[0] = 0; p[1] = 1; p++; cout<< *p <<endl; return 0; } | cs |
p는 &p[0]로 고쳐쓸 수 있다.
여기서 p++을 하면 sizeof(int)만큼 나아간다. 따라서 p++수행 후 p = &p[1]과 같아진다.
따라서 위의 코드를 실행하면 p[1]값인 1이 출력된다.
4. 템플릿
템플릿은 하나의 클래스를 서로 다른 타입에 재사용할 수 있도록 하는 방법이다.
예를들어 하나의 코드로 여러 타입의 객체를 저장할 수 있는 연결리스트를 만들 수 있다.
예시코드 ( 코드를 분석하기보단, 언제 어디에서 템플릿 T가 쓰였는지 확인하면 된다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | template class LinkedList{ T* array; int offset, size; public: LinkedList(int sz) : offset(0), size(sz){ array = new T[size]; } ~LinkedList(){ delete [] array; } void LinkedBy(int n){ offset = (offset + n) % size; } T getAt(int i){ return array[convertIndex(i)]; } void setAt(T item, int i){ array[convertIndex(i)] = item; } private: int convertIndex(int i){ int index = (i-offset) % size; while(index < 0) index += size; return index; } }; | cs |
면접 지식 기반 문제
C/C++(2)
끝
'Interview' 카테고리의 다른 글
면접 지식 기반 문제_C/C++(1) (0) | 2019.01.30 |
---|