스택 영역에 할당됨
.
연산자로 인스턴스에 접근Test t("hello");
t.display();
힙 영역에 할당됨
new
키워드 사용delete
로 메모리가 반환될 때 소멸->
연산자로 인스턴스에 접근Test *t = new Test("hello");
t->display();
delete t;
t = 0;
Zombie
클래스name
void announce( void );
<name>: BraiiiiiiinnnzzzZ...
Zombie* newZombie( std::string name );
void randomChump( std::string name );
new []
와 delete []
Test *test_arr = new Test[10];
delete [] test_arr;
test_arr = 0;
N
마리의 좀비를 생성하는 함수name
으로 이름 설정Zombie* zombieHorde( int N, std::string name );
announce
를 호출하는 테스트 작성delete
로 모든 좀비의 메모리 해제👉 일단 객체 배열을 생성한 다음 반복문을 돌면서 각 인스턴스의 이름 설정해주기 (setter 구현)
https://gracefulprograming.tistory.com/11
int a = 10;
int *p = &a; // 포인터
int &r = a; // 참조자
변수의 메모리 주소를 가지는 변수
(C와 같은 개념)
변수의 다른 이름 (별명)
*
연산자를 따로 사용할 필요없이 원본 변수를 변경할 수 있어서 코드가 간결해짐HI THIS IS BRAIN
로 초기화된 string 변수 생성stringPTR
: string을 가리키는 포인터stringREF
: string의 참조자stringPTR
가 가진 주소stringREF
가 가진 주소stringPTR
가 가리키는 값stringREF
가 가리키는 값참조하는 값이 const가 아니라도 const로 간주하도록 하는 참조자
int x = 5;
const int &ref1 = x; // non-const 참조
const int y = 7;
const int &ref2 = y; // const 참조
const int &ref3 = 6; // r-value 참조
l-value, r-value
l-value
: 메모리 주소를 가지는 값r-value
: 메모리 주소가 없고, 표현식 범위에만 있는 임시 값 (지역 변수, 대입연산자 오른쪽에 있는 값)
Weapon
클래스std::string type
getType()
: type
의 const 참조자 리턴setType()
: 인자로 받은 값을 type
으로 세팅HumanA
, HumanB
클래스Weapon
, name
attack()
<name> attacks with their <weapon type>
HumanA
는 생성자에서 Weapon
을 얻지만 HumanB
는 아님HumanB
가 항상 Weapon
을 가지고 있지는 않지만 HumanA
는 항상 가지고 있음👉 HumanA
는 생성자에서 Weapon
을 얻기 때문에 Weapon
을 참조자로 가지고, HumanB
는 그렇지 않으므로 포인터로 가지도록 구현
crude spiked club
, some other type of club
순으로 2번 메시지 출력int main()
{
{
Weapon club = Weapon("crude spiked club");
HumanA bob("Bob", club);
bob.attack();
club.setType("some other type of club");
bob.attack();
}
{
Weapon club = Weapon("crude spiked club");
HumanB jim("Jim");
jim.setWeapon(club);
jim.attack();
club.setType("some other type of club");
jim.attack();
}
return 0;
}
파일 입출력 스트림
std::ifstream
과 std::ofstream
의 생성자에 파일명을 전달하여 파일을 열 수 있음open()
을 굳이 따로 호출할 필요 없음)good()
: 스트림이 잘 열렸는지 확인close()
: 스트림 닫기eof()
: 파일을 다 읽었는지 확인std::string::getline()
: 한 줄씩 읽어들임filename
, s1
, s2
)를 받는 프로그램filename
파일을 열어서 filename.replace
에 복사하는데, s1
을 s2
로 바꿈std::string::replace()
를 사용할 수 없음함수를 가리키는 포인터
리턴타입 (*변수명)(매개변수리스트);
int foo(int x) { return x; }
int (*ptr)(int) = foo;
https://beafreespirit.tistory.com/85
&
연산자로 가져와야 함.*
, ->*
연산자 사용)리턴타입 (클래스명::*변수명)(매개변수 리스트);
class Test
{
public:
int foo(int x) { return x; }
};
Test test;
int (Test::*ptr)(int) = &Test::foo;
std::cout << (test.*ptr)(1) << std::endl;
this
(해당 멤버 함수를 호출한 객체의 주소)를 통해 호출 가능리턴타입 (클래스명::*변수명)(매개변수 리스트);
class Test
{
private:
int foo(int x) { return x; }
public:
void goo(int x) {
int (Test::*ptr)(int) = &Test::foo;
std::cout << (this->*f)(x) << std::endl;
}
};
로그 남기기
DEBUG
: 맥락 정보. 프로그램 진단에 사용됨"I love having extra bacon for my 7XL-double-cheese-triple-pickle-specialketchup burger. I really do!"
INFO
: 추가 정보. 프로그램 실행이나 환경을 남길 때 유용"I cannot believe adding extra bacon costs more money. You didn’t put enough bacon in my burger! If you did, I wouldn’t be asking for more!"
WARNING
: 시스템의 잠재적인 문제. 핸들링 가능하거나 무시될 수 있음"I think I deserve to have some extra bacon for free. I’ve been coming for years whereas you started working here since last month."
ERROR
: 복구 불가능한 에러 발생. 직접 간섭이 필요한 치명적인 문제"This is unacceptable! I want to speak to the manager now."
Harl
클래스void debug( void );
void info( void );
void warning( void );
void error( void );
void complain( std::string level );
void (*f_ptr[4])(void) = {&Harl::debug, &Harl::info, &Harl::warning, &Harl::error};
if/else if/else
구문을 사용하지 말 것harlFilter
switch
구문 사용[ Probably complaining about insignificant problems ]
출력$> ./harlFilter "WARNING"
[ WARNING ]
I think I deserve to have some extra bacon for free.
I've been coming for years whereas you started working here since last month.
[ ERROR ]
This is unacceptable, I want to speak to the manager now.
$> ./harlFilter "I am not sure how tired I am today..."
[ Probably complaining about insignificant problems ]