본문 바로가기
C++(공부중)

C++ 공부 3일차

by 케찹이 2020. 7. 30.

this는 자기 자신 즉 객체본인을 가리키는 포인터이다. 

 

레퍼런스 본인을 리턴하는 함수.

#include<iostream>

class anything{
  int a;
  
 public:
  anything(int something) : a(something) {}
  
  int& ref() {return a; }
  int not_ref() {return a;}
  void show() { std::cout << a << std::endl;}
};

int main(){
  anything A(2);
  A.show();
  
  int& some_ref = A.ref();
  some_ref = 1;
  A.show();
  
  int some_not_ref = A.ref();
  some_not_ref = 6;
  A.show();
  
  int& error = A.not_ref();		//ERROR!
  error = 9;
  A.show();
  
  int last = A.not_ref();
  last = 0;
  A.show();
}

레퍼런스함수는 위 네가지 상황의 코드들만 이해하면 된다.

첫번째 레퍼런스 변수가 레퍼런스 함수를 받을때, 이거는 some_ref가 ref의 별명이고 ref는 a의 별명이 되어 결국 some_ref = a관계가 형성된다. 그래서 a의 값은 1로 바뀌고 show() 출력하면 1이 출력된다.

두번째 그냥 정수형 변수가 레퍼런스 함수를 리턴받으면 그냥 a의 별명인 ref를 리턴 받게되고 a의 값과 똑같은 ref는 a값을 some_not_ref에 저장하게 되고 some_not_ref가 변수값을 바꾸어도 직접적으로 a에 영향을 끼치지 않아 show()할 경우 1이 출력된다.

세번째 경우는 에러가 발생하는 경우인데 레퍼런스 변수에 그냥 변수를 복사한다. 객체에서 레퍼런스가 아닌 값을 복사할때에는 임시 객체가 생성된다. 즉 클래스안의 함수에서 레퍼런스가 아닌 타입을 리턴할 때 임시객체가 생성되어 그 값을 복사하여 임시객체에 보관하게 됩니다. 근데 이 임시객체는 복사명령 문장이 끝나면 소멸되기 때문에 이 임시객체에 대한 레퍼런스를 가질수가 없습니다. 그럼으로 에러가 발생하게 됩니다. 

마지막 상황은 C를 배운 이상 굳이 설명은 필요없을 것 같다. 

 

그리고 const함수가 있는데 우리가 const를 변수에 사용했던 것처럼 const함수는 변수들의 값을 바꿀 수 없고 오직 읽을 수만 있는 함수이다. 프로그램을 한명이 아닌 다수가 설계할 때에는 빼놓을 수 없는 함수이다. 

 

문자열에 대한 이야기는 나중에 다시 한번 복습할때 작성하도록 하겠다. (그 이유는 어렵기 때문이다....)

 

explicit는 재미있는 기능인데 C++에서는 생성자가 들어갈 위치에 완벽하게 쓰지 않고 생성자의 매개변수만을 집어 넣어도 해당 생성자의 함수가 존재하면 자동으로 인식을 하여 코드를 진행하게 하는 기능이 있다. 이러한 기능을 사용하지 않을려면 바로 클래스안 생성자 함수 앞에 explicit을 붙이면 된다.

그리고 mutable이라는 것이 있는데 앞서 말했듯이 const함수안에서는 변수의 값들을 바꿀수 없다. 하지만 클래스내 변수앞에 mutable을 붙여주면 const함수 안에서도 해당 변수의 값을 바꾸게 하는 것이 가능하다. 

 

*씹어먹는 C++을 참조하였습니다.

'C++(공부중)' 카테고리의 다른 글

C++ 공부 2일차  (0) 2020.07.28
C++ 공부 1일차  (1) 2020.07.28

댓글