Languages(59)
-
[C++] 초기화 리스트(Initializer list), static
*을 보며 공부하여 정리한 글입니다. 오늘도 열심히 우리의 이해를 도와줄 몬스터(Monster) 클래스! #include #include class Monster { private: std::string name; int health; int damage; static int totalMonsterNum; public: Monster() = default; Monster(std::string name, int health, int damage); }; 초기화 리스트를 사용하지 않은 일반적인 생성자 Monster::Monster(std::string name, int health, int damage) { this->name = name; this->health = health; this->damage =..
2022.02.09 -
[C++] 복사 생성자(Copy constructor), 얕은 복사(Shallow Copy), 깊은 복사(Deep Copy)
*을 보며 공부하여 정리한 글입니다. 1. 복사 생성자(Copy constructor) 객체를 복사하여 생성할 때 호출되는 생성자를 말한다. 사용자가 따로 넣지 않을 경우, 컴파일러가 자동적으로 디폴트 복사 생성자를 삽입해준다. class Monster { char* name; int hp; int damage; public: Monster(const Monster& copyMonster); // 복사 생성자 ... }; 함수 내부에서, 받은 인자의 값을 변경할 일이 없다면 다음과 같이 정의하는 것이 더 안전하다. Moster(const Monster& copyMonster); 즉, 다른 객체의 상수 레퍼런스를 매개변수로 받는다. const 이기 때문에 복사 생성자 내부에서 매개변수로 가져온 참조 데이터..
2022.02.09 -
[C++] 생성자(Default Constructor) 사용 시 주의사항
*을 보며 공부하여 정리한 글입니다. 예시를 들기 위해 다음과 같이 몬스터(Monster) 클래스가 있다고 가정한다. class Monster { private: string name; int hp; int attackDamage; public: Monster(); Monster(string name, int hp, int attackDamage) { ... } ... }; 객체 생성 방법 (동적 할당 X) 암시적 방법(Implicit) Monster monster("달팽이", 100, 5); Monster defMonster; // 디폴트 생성자 사용하여 객체 생성 명시적 방법(Explicit) Monster monster = Monster("달팽이", 100, 5); Monster defMonster..
2022.02.08 -
[C++] C++ 컴파일러에서 함수를 오버로딩(Overloading)하는 과정
*을 보며 공부하여 정리한 글입니다. 1. 함수 오버로딩(Overloading)이란? 동일한 이름의 함수를 매개변수 타입, 매개변수의 개수에 따라 구분하여 여러 개 생성 가능하게 하는 것을 말합니다. 비슷한 기능인데 함수 이름이 각각 달라, 개별적으로 기억할 수고가 없어져서 편리합니다. 함수의 리턴 타입으로도 구분이 가능하나, 리턴 타입만 다르고 매개변수까지 똑같은 함수를 만드는 것은 불가능 #include // 함수 오버로딩 int Add(int x, double y) { return x + y; } int Add(int x, int y) { return x + y; } double Add(double x, double y) { return x + y; } // int Add(double x, doub..
2022.02.08 -
[C++] 참조자(Reference)
*을 보며 공부하여 정리한 글입니다. 1. 참조자(Reference)란? C 언어에서는 함수에 인자 전달 시, 원본을 바꾸는 방법으로는 Call by address밖에 없었다. 하지만, C++에서는 Call by address 외에도 다른 변수나 상수를 가리킬 수 있는 참조자(Reference) 방식또한 지원한다. 포인터와 달리 &와 * 연산자 사용이 줄기 때문에 코드를 훨씬 간결하게 나타낼 수 있다. scanf()와 달리 cin이 &를 사용하여 주소값을 줄 필요가 없는 것도 cin 내부적으로 참조를 받기 때문이다. int x = 5; int& referenceX = x; // 참조자 선언 referenceX = 10; std::cout
2022.02.08 -
[C++] 이름공간(namespace) 사용 시 주의사항
이름 공간 전체 사용 선언은 권장하지 않는다. C++ 프로그래밍을 할 때, 범위지정 연산자를 붙이기 귀찮아서 다음과 같이 이름 공간 전체를 사용하겠다고 선언한 적이 있다. using namespace std; // std 이름 공간 전체 사용 선언 하지만 이런 방법은 권장되지 않는다고 한다. std 이름 공간 내부에 이름이 겹치는 함수를 만들게 된다면 오류가 발생하기 때문이다. C++ 표준 라이브러리는 매우 거대해서 수많은 함수들이 존재한다. 그러니, 자칫 잘못해서 위와 같은 오류가 발생한다면 해결하는데 매우 힘이 들 것이라고 한다. 또한, C++ 버전이 바뀔 때마다 기존 이름 공간에서 추가되는 함수들이 있을 수 있으므로 기존에 잘 작동하던 코드가 이름 충돌로 인해 동작하지 않을 수도 있다고 한다. 따라..
2022.02.07