effective C++ 정리1
1. C++에서는 #define이 아니라 const, enum을 먼저 써야한다.
#define을 사용한 경우
#include<iostream>
using namespace std;
#define PI 3.141592
void Add(double a) { }
void Sub(double a) { }
int main()
{
Add(PI);
Sub(PI);
return 0;
}
const를 사용한 경우
#include<iostream>
using namespace std;
void Add(double a) { }
void Sub(double a) { }
int main()
{
const double pi = 3.141592;
Add(pi);
Sub(pi);
return 0;
}
==> 상수가 부동소수점 실수 타입일 경우에는 컴파일을 거친 최종 코드의 크기가 #define이 const보다 더 크게 나올 수 있다. const의 사본은 딱 한 번만 생기기 때문이다.
class에서 상수가 필요한 경우
#include <iostream>
using namespace std;
class Mage
{
public:
static const int s_number = 5;
int _number[s_number];
static int s_attack;
};
int Mage::s_attack = 10;
int main()
{
Mage m1;
cout << m1.s_number << endl;
cout << m1.s_attack << endl;
return 0;
}
static const int s_number = 5;
int _number[s_number];
=> 이 코드가 class에서 상수를 선언하고 사용하는 방법이다. s_number의 유효범위는 Mage class 이다.
static int s_attack;
=> 이 코드는 클래스의 정적(static) 멤버로서 모든 객체가 이 정보를 공통적으로 가지고 있을 때 사용하기 유용하다. const를 붙이지 않았기 때문에 class 안쪽에서 선언과 정의를 동시에 할 수가 없다.
class에서 상수가 선언과 동시에 정의되지 않을 때
위와 같은 방법이 통하지 않을 때는 헤더 파일에 선언만 하고
class Mage
{
public:
static const int s_number;
};
실행 파일(.cpp)에 정의하면 된다.
const int Mage::s_number = 5;
enum을 이용해 class 상수 선언하기
#include <iostream>
using namespace std;
class Mage
{
public:
enum { enum_number = 5};
int _numbers[enum_number];
};
이런식으로 enum을 활용해서 static const int s_number = 5; 와 같은 효과를 낼 수 있다.