extern
외부 파일 어딘가에 전역 변수로 선언되어 있다는 뜻을 가진 키워드이다.
//fileA.cpp
int i = 42; // declaration and definition
//fileB.cpp
extern int i; // declaration only. same as i in FileA
//fileC.cpp
extern int i; // declaration only. same as i in FileA
//fileD.cpp
int i = 43; // LNK2005! 'i' already has a definition.
extern int i = 43; // same error (extern is ignored on definitions)
fileA에 전역변수 i가 선언되었으므로 다른 파일에서 i라는 이름의 전역 변수를 사용할 수 없다.
fileB,C에서 extern 키워드를 이용해 fileA의 전역변수 i에 접근할 수 있다.
fileD에서는 extern 키워드를 이용해 재정의 하려고하지만 그것은 불가능하다.
friend
클래스가 함수 또는 클래스에 모든 액세스 권한을 부여하는 키워드이다.
class A
{
friend class B;
friend void B::func();
};
위 코드처럼 A의 friend class로 B를 설정해 B가 A의 모든 멤버에 액세스 할 수 있고
B의 func를 friend로 지정하면 func함수에서만 A의 모든 멤버에 액세스 할 수 있다.
반대로 A에서 B의 모든 멤버에 액세스할수는 없다. (public멤버만 가능) 일방적인 친구관계다.
상속성
클래스를 상속할 때 public, private, protected 속성으로 액세스를 지정할 수 있다.
아무것도 적지 않는다면 구조체는 디폴트가 public, 클래스는 private이다.
아래 파생 클래스의 액세스 속성은 클래스 바깥에서 인스턴스를 통해 액세스할 때 기준이다.

자식 객체를 생성할 때 부모 생성자가 가장 먼저 호출되고 자식 생성자가 호출된다.
그리고 소멸할 때는 자식 소멸자가 호출된 뒤 부모 소멸자가 호출된다. 그 이유는 부모 클래스는 자식 클래스가 동작하기
위한 전제조건이기 때문에 자식 클래스 멤버보다 상속받은 멤버가 먼저 초기화되어야 하기 때문이다.
자식 생성자 본체보다 상속받은 멤버 초기화가 우선되어야 하며 그 방법은 초기화 리스트밖에 없다.
Derived(인수들) : Base(상속받은 인수들) {
본체 - 여기서 자신의 고유 멤버 초기화
}
자식 클래스의 초기화 리스트에서 부모 클래스의 생성자를 호출하지 않으면 부모 클래스의 디폴트 생성자를 호출한다.
디폴트 생성자는 보통 아무것도 초기화하지 않거나 0으로 초기화하므로 상속받은 멤버는 원하는 대로 초기화되지 않을 것이다. 그래서 자식 클래스의 생성자의 초기화 리스트에는 거의 예외 없이 부모 클래스의 생성자 호출문을 작성한다.
'Today I Learned' 카테고리의 다른 글
| 23.02.17 - 순수 가상 함수, 가상 소멸자, 캐스팅 연산자 (0) | 2023.02.17 |
|---|---|
| 23.02.16 - 정적 바인딩과 동적 바인딩, 가상 함수 (0) | 2023.02.16 |
| 23.02.14 - 클래스 내 static, 복사 생성자 (0) | 2023.02.14 |
| 23.02.13 - 이니셜라이저, const 함수 (0) | 2023.02.13 |
| 23.02.06 ~ 23.02.10 - 객체, 생성자, explicit, 전방선언 (0) | 2023.02.13 |