씨쁠쁠01

오젼·2022년 5월 30일
0

[cpp]

목록 보기
2/9

ex00

new & delete

  • new, delete keyword
  • new가 malloc 역할. 다른 점은 new는 생성자를 호출한다는 것. malloc으로 인스턴스를 할당하면 생성자가 호출되지 않아서 쓰레기 값이 들어가버림. new 키워드 자체가 malloc과 생성자 호출을 랩핑한 형태라고 함
  • new 키워드로 힙에 메모리를 할당해줬으면, delete로 해제해줘야 함.
  • delete는 메모리해제와 소멸자 호출이 같이 이루어짐.

ex01

new[] & delete[]

  • new로 배열을 할당하고 싶을 때 : ex) int *p = new int[n]
  • 대신 new로 할당한 배열을 해제할 때는 delete[] p 이렇게 해제해 줘야 함.

ex02

pointer vs reference

  • https://www.geeksforgeeks.org/pointers-vs-references-cpp/
  • C에서는 메모리 공간에 하나의 이름만 부여할 수 있지만, C++ 에서는 메모리 공간에 여러 이름을 부여할 수 있음. == reference로 같은 공간다른 이름(별칭)으로 접근 하는 게 가능
  • pointer는 변수의 메모리 주소를 담음(간접 참조). reference는 alias. 별칭이라고 생각하면 됨(직접 참조).
  • reference는 원본값과 동일한 메모리 공간을 사용함
  • pointer는 메모리 공간이 따로 할당 되고 그 안에 원본의 주소값을 담고 있음
  • pointer는 선언 후 값을 줄 수 있지만 reference는 선언과 초기화가 동시에 이루어져야 함. 선언 해놓고 나중에 값을 바꾸는 것 안 됨.

ex03

getter

  • getter: private으로 멤버변수를 선언하게 되면 그 변수를 직접적으로 손 대지 못하니, getter라는 public 멤버함수를 만들어서 private 멤버변수를 읽어오는 것.

setter

  • setter: 마찬가지. 이건 값을 직접 바꾸는 용도로 사용.

함수 인자로서 참조자

  • 참조자를 함수 파라미터로 사용하게 되면 함수를 사용할 때 &기호를 붙이지 않아도 알아서 참조자로 전달. 이걸 함수 안에서 다시 &를 써서 메모리 주소를 포인터 변수에 연결시켜 놓으면 함수 안에서 값을 업데이트 시킨 것이 밖에서도 적용됨.
  • (원래 c에선 포인터를 사용하지 않으면 무조건 변수가 복사 되어서 함수 안에서 지역변수로 사용이 되고 함수가 끝나면 사라져버렸음. 그래서 포인터 인자를 사용해서 애초에 함수에 &기호를 붙여서 메모리 주소로 전달해 줘야 했었는데 cpp에선 그냥 함수 인자를 참조자로 선언해놓으면 &기호 안 붙이고 전달해줘도 참조자로 전달.)

ex04

std::ifilestream, std::ofstream

std::getline()

std::string::find(), std::string::erase(), std::string::insert()

ex05

private member function

  • 캡슐화, 은닉성과 관련이 있음
  • 함수를 사용하지만 외부에서 사용할 일이 없는 경우 private으로 선언해 놓고 사용 가능.

function pointer

  • [반환형] [변수명] [함수 인자] 꼴로 사용
void	(Harl::*fptr)( void )

function pointer사용 오류

/* levels 멤버함수포인터 배열 */
void		(Harl::*fptr[])( void ) = {
	&Harl::debug,
	&Harl::info,
	&Harl::warning,
	&Harl::error
};
/* error case */
for (int i = 0; i < 4; i++)
{
	if (level == levels[i])
		*fptr[i]();
}
/* fixed case */
for (int i = 0; i < 4; i++)
{
	if (level == levels[i])
		(this->*fptr[i])();
}

if, else문 없이 함수포인터 사용하기 - 배열 사용하기

std::string	levels[] = {
		"debug",
		"info",
		"warning",
		"error"
	};
void		(Harl::*fptr[])( void ) = {
	&Harl::debug,
	&Harl::info,
	&Harl::warning,
	&Harl::error
};
  • map함수를 사용하면 더 쉽고 직관적이겠지만, cpp08 전까지는 STL 사용이 금지 되었기 때문에 각 배열을 따로 선언해주고 인덱스가 같게끔 해서 연결해주는 방법을 사용.

0개의 댓글