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(45<<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 &= a;
    b = 7;
    cout<<a<<endl;
    return 0;
}
cs

위의 코드를 보면 7번 라인에서 b는 a의 참조로 선언되었다. 따라서 b를 변경하면 a도 바뀐다.


참조 변수는 상수를 참조할 수 없다. 

상수는 임시적으로 존재하는 값이다. 다음행으로 넘어가면 존재하지 않는다.

아래의 코드에서 b는 12를 참조하는데, 숫자 12를 참조할 주소가 없으므로 에러가 난다.

1
int &= 12;
cs


따라서 참조와 동시에 초기화를 하기 위해서는 12라는 숫자가 메모리 상에 존재해야한다.

이를 위해 const변수로 설정을 해 주는데, const를 붙여주면 임시변수라는것을 만들어 그 임시변수에 12를 저장하여 b는 임시변수를 참조하게 된다.

1
2
3
/* 12를 저장하기 위한 메모리를 할당하고, 
b가 해당 메모리를 참조하도록 한다.*/
const int &= 12;
cs


포인터와 달리 참조는 null이 될 수 없으며, 다른 메모리에 재할당될 수도 없다.


3. 포인터 연산

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using namespace std;
 
int main(){
    int *= new int[2];
    p[0= 0;
    p[1= 1;
    p++;
    cout<< *<<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
Posted by Jyoel :