class의 기본 접근 권한자는 private.
struct의 기본 접근 권한자는 public.
이외의 차이는 없음.
안전성, 추상화
구조체에서도 생성자, 소멸자 사용 가능.
GCC - 초기화 수행
MSVC - 초기화 수행 안함. 초기화되지 않은 지역변수 사용 에러.
new-delete는 생성자-소멸자 호출.
malloc-free는 메모리 할당 해제만 수행.
class Container
{
Test arr(10);
};
class 내부에서 기본적인 초기화는 가능하지만 위의 형식은 불가능.
정의 부분에서 메모리 할당을 시도하는 것이 문제인 듯.
여러 translation unit에서 중복으로 정의되었더라도 모두 동일한 것이므로 그 중에서 아무거나 사용 가능을 의미.
ODR(유일 정의 규칙)을 무시하도록 허용.
class Test
{
void func() { cout << "test"; } //묵시적 inline
};
함수의 선언과 정의가 분리되지 않았다면 묵시적 inline처리가 된다.
실제로 inline되는지는 compiler가 결정한다.
//.h
class Test
{
static int val;
};
//.cpp
Test::int val = 0;
class static 변수는 범위 밖에서 초기화를 수행해야 한다.
//.h
class Child : private Parent
{
//...
};
//main.cpp
int main()
{
Parent* p = new Child;//접근 불가
};
class Stack : private LinkedList
{
public:
void push(int val) { push_back(val); }
};
Has-a관계가 아닌 Is-a관계를 재정의 할 때 사용하기 유용할 듯.
class Parent
{
public:
int publicVal;
private:
int privateVal;
};
class Child : private Parent
{
friend class FriendClass;
};
class FriendClass
{
Child c;
void func()
{
c.publicVal = 10; //접근 가능
c.privateVal = 10; //접근 불가
}
};
friend 키워드는 friend한 클래스의 private변수에 접근 가능.
class TValue
{
private:
friend class TToken;
TValue(TCHAR*);
};
TValue는 TToken만의 전용 클래스로 사용.
class Test
{
Test& operator*(int val); //t1 * 2
friend operator(int val, Test& t); //2 * t1
};
friend를 통해 위치에 상관없이 연산자 재정의 사용이 가능함.
전방 선언이란 클래스, 함수가 실제로 필요로 할 때 정의를 제공하겠다는 컴파일러와의 약속.
class RetClass;
class ParamClass1;
class ParamClass2;
class ParamClass3;
class Test
{
RetClass func(ParamClass1* pc1, ParamClass2& pc2, ParamClass3 pc3);
};
객체 생성이 아닌 선언 정도를 위해서는 전방 선언만 사용해도 상관 없음.
cpp파일 중 전방선언한 객체에 실제로 접근하는 시점에 include 필요.
Header에 include를 최대한 줄이므로서 컴파일 시간을 단축시키는 장점이 있음.