virtual

파생 클래스에서 재정의 될 수 있다고 알려주는 키워드

 

 

기본 사용

함수 앞에 virtual 키워드를 통해 사용할 수 있다.

 

 

virtual 없는 경우 

함수 앞에 virtual이 없어도 상위 함수를 호출할 수 있다.

 

 

재정의

하위 클래스에서 함수를 재정의 할 수 있다.

 

 

하위클래스 virtual

하위 클래스에 virtual 키워드를 통해 명시적으로 표현할 수 있다.

 

 

하위클래스 override

override 키워드를 통해 명시적으로

재정의 했다고 알려줄 수 있다.

 

 

virtual과 override

override 키워드를 사용했을 경우에는

virtual 키워드가 필요하다

 

 

정적바인딩

상위클래스 포인터형으로 저장된 하위클래스는

상위클래스 함수 호출

 

 

동적바인딩

상위클래스 포인터형으로 저장된 하위클래스는

가상함수테이블을 통해 하위클래스 함수 호출

 

 

형변환 연산자

정상적으로 형변환 되어 작동한다.

 

 

dynamic_cast

virtual 키워드가 없을 경우 dynamic_cast 불가능

 

 

가상 함수

가상함수 선언시 반드시 재정의 해주어야 한다.

 

재정의 시 정상적으로 작동하게 된다.

'C++' 카테고리의 다른 글

[C++] friend  (0) 2023.05.18
[C++] constexpr  (0) 2023.05.16
[C++] 참조자  (0) 2023.05.15
[C++] const  (0) 2023.05.13
[C++] 복사대입연산자  (0) 2023.05.12

friend

선언대상에게 정보를 공유해 주는 키워드

사용할 경우 캡슐화가 깨질 수 있어 주의해야 한다.

 

 

friend 클래스

위와 같이 클래스 앞에 friend를 붙여주면 된다.

class 키워드를 빼도 동일하게 작동한다.

 

 

접근 허용

friend 클래스에게 나의 protected, private 접근을 허용한다.

 

 

friend 클래스가 아닐 경우

protected, private에 접근할 수 없다.

 

 

순서의 중요성

Apple이라는 클래스가 만들어질 때

Orange라는 클래스의 정보가 없어 문제가 생기게 된다.

 

 

일방적인 friend

friend를 통해 접근권한을 허용했지만

상호적으로 허용되는 것은 아니다.

 

 

상호참조

서로가 서로를 필요로 하게 되어서 생성이 불가능하게 된다.

(닭이 먼저인가, 달걀이 먼저인가)

 

 

전방선언

전방선언과 포인터를 이용해 사용할 수도 있다.

 

 

상속

상위 클래스의 friend의 영향을 받는 클래스는

상위클래스의 protected, private 접근가능하다

 

상속받은 클래스는 상위 friend의 효력이 사라진다

하위 클래스의 protected, private 접근이 불가능하다

 

 

연계

A가 B에게 접근을 허용하고

B가 C에게 접근을 허용해도

C가 A에 접근허용되는 것은 아니다.

 

모두에게 권한을 줘야 작동하게 된다.

 

 

friend 함수

friend 키워드를 통해 함수밖에서

protected, private에 접근이 허용된다.

 

friend 키워드를 지울 경우 접근이 제한된다.

'C++' 카테고리의 다른 글

[C++] virtual  (0) 2023.05.23
[C++] constexpr  (0) 2023.05.16
[C++] 참조자  (0) 2023.05.15
[C++] const  (0) 2023.05.13
[C++] 복사대입연산자  (0) 2023.05.12

constexpr

컴파일시간에 값이 결정된다고 알려주는 키워드

c++14 기준으로 작성되었습니다.

 

 

기본사용

변수명, 함수명 앞에 constexpr키워드를 통해 선언할 수 있다.

constexpr은 const의 성질을 가지고 간다.

 

 

변경불가

한번 선언되면 변경이 불가능하다

 

 

변수

값의 변화가 있는 수는 당연히 사용 할 수 없다.

 

 

상수

컴파일 타임에 정해지기 위해서는 상수여야만 한다.

 

 

함수

컴파일 타임에 정해진다는 보장이 없으므로 불가능하다.

 

constexpr 키워드를 통해 사용 할 수 있다.

 

 

C++14

C++14부터는 지역변수의 선언이 가능하다.

재귀를 호출하지 않고도 계산 할 수 있다.

 

 

런타임

컴파일타임에 사용되지 못할 경우

런타임에 함수가 작동하게 된다.

 

 

멤버변수

멤버변수로서 constexpr은 사용이 불가능하다.

 

 

상속

virtual 키워드와 constexpr은 같이 사용할 수 없다.

 

 

c++20

c++20에서는 virtual과 constexpr을 동시에 사용할 수 있다.

'C++' 카테고리의 다른 글

[C++] virtual  (0) 2023.05.23
[C++] friend  (0) 2023.05.18
[C++] 참조자  (0) 2023.05.15
[C++] const  (0) 2023.05.13
[C++] 복사대입연산자  (0) 2023.05.12

참조자

특정 변수이름 대신 사용할 수 있는 별명

 

 

기본사용

별명처럼 변수를 사용할 수 있기 때문에

변수와 레퍼런스값 모두 같은 값을 출력한다.

 

 

주소값 공유

두 값 모두 같은 주소를 가리키고 있기 때문에

하나를 변경할 경우 둘 다 영향을 받는다.

 

 

초기값 지정

일반적으로 레퍼런스는 저장된 주소를 복사한다.

저장된 주소가 없을 경우 사용이 불가능하다.

 

 

nullptr 불가

nullptr, NULL로 초기화하는 방식도 불가능하다.

 

 

상수 레퍼런스

const 키워드가 없을 경우에는 리터럴 상수로 선언 불가능하다.

 

const 키워드를 통해 리터럴 상수를 사용 할 수 있다.

 

 

레퍼런스를 이용한 치환

참조자를 이용해 값을 서로 교환해 줄 수 있다.

 

 

레퍼런스 반환의 위험성

참조자로 반환값을 받을 경우에 조심해야한다.

위 상황은 스택에서 제거된 주소를 계속 가리키고 있다.

 

 

이동생성자

어떠한 객체를 옮겨야 할 때 복사해서 지울 경우에는 임시객체를 생성한다

객체가 커질수록 많은 부하를 가져오게 돼서 주의해야 한다.

'C++' 카테고리의 다른 글

[C++] friend  (0) 2023.05.18
[C++] constexpr  (0) 2023.05.16
[C++] const  (0) 2023.05.13
[C++] 복사대입연산자  (0) 2023.05.12
[C++] 복사생성자  (0) 2023.05.11

const

상수로 선언하여 수정하지 못하도록 하는 키워드

 

 

일반변수 const 선언

 

 

일반변수 const 변경

변경을 시도할 경우 컴파일 에러가 나게 된다.

 

 

포인터 const (변수명 앞)

변수명이 가리키는 변수의 값은 변경이 가능하다.

 

포인터자료형 변수명 앞에 const가 붙은 경우

변수명이 가리키는 주소변경이 불가능하다.

 

 

포인터 const (자료형 포인터 앞)

포인터가 가리키는 변수의 주소는 변경이 가능하다.

 

포인터가 가리키고 있는 값의 변경은 불가능하다.

 

pA를 통한 값 변경은 불가능했지만 iA를 통해 변경할 수 있다.

 

 

const 멤버 변수 

초기화리스트를 통해 값을 초기화할 수 있다.

 

대입해서 초기화 할경우 컴파일 에러가 나게 된다.

 

 

const 함수 

함수명 뒤에 const를 붙이면 멤버변수의 변경이 금지된다.

 

지역변수의 변경은 허용된다.

 

 

const 객체

정상적으로 값이 바뀌고 실행된다.

 

const가 붙은 객체는 멤버변수의 값을 변경시킬 수 없다.

 

getHealth()의 const 키워드를 제거하면 컴파일 에러가 난다. 

const 객체는 const가 붙은 함수만 호출할 수 있다.

 

 

const 오버로딩

const가 붙지 않은 객체는 const가 붙지 않은 함수를 호출하고

const가 붙은 객체는 const가 붙은 함수를 호출한다

 

const가 붙지 않은 객체도 const가 붙은 함수를 호출 할 수 있다.

 

const가 붙은 객체는 const가 붙지 않는 함수를 호출 할 수 없다.

 

 

mutable

mutable 키워드가 붙은 변수는 const가 붙은 함수 내에서도 변경이 가능하다.

'C++' 카테고리의 다른 글

[C++] constexpr  (0) 2023.05.16
[C++] 참조자  (0) 2023.05.15
[C++] 복사대입연산자  (0) 2023.05.12
[C++] 복사생성자  (0) 2023.05.11
[C++] 소멸자  (1) 2023.05.10

복사대입연산자

자신과 같은 타입의 객체를 받아 초기화하는 것

 

 

디폴트 복사대입연산자

복사대입연산자가 없어도 기본복사대입연산자가 호출된다.

 

 

복사대입연산자 선언

복사대입연산자를 오버라이딩을 통해 구현 할 수 있다.

return의 값을 *this로 해주는 것이 핵심이다.

 

 

복사대입연산 방지

복사대입연산자에 delete 키워드를 이용하여 삭제한다

대입을 시도할 경우 컴파일 에러가 난다.

 

 

얕은 복사

기본 복사대입연산자는 얕은 복사를 한다

player2와 player1이 모두 같은 변수의 주소를 가리키고 있다.

변수를 수정하면 두 클래스 모두 영향을 받는다.

또한 할당한 메모리를 제거하고 있지 않아 메모리 누수가 난다.

 

소멸자에서 메모리 할당을 해제하면

두 클래스의 m_iHealth값이 같으므로

먼저 소멸자가 호출된 클래스는 정상적으로 작동하지만

다음 소멸자가 호출된 클래스는 주소를 가리키고 있지만

접근 권한이 없어 런타임 에러가 나게 된다.

 

 

깊은 복사

복사대입연산시 새롭게 할당해 새로운 주소값을 가리키도록 한다.

소멸 시에도 정상적으로 메모리를 해제한다.

'C++' 카테고리의 다른 글

[C++] 참조자  (0) 2023.05.15
[C++] const  (0) 2023.05.13
[C++] 복사생성자  (0) 2023.05.11
[C++] 소멸자  (1) 2023.05.10
[C++] 생성자  (0) 2023.05.09

복사생성자

자신과 같은 타입의 객체를 받아 초기화하는 것

 

 

디폴트 복사생성자

복사생성자가 없어도 기본복사생성자가 호출된다.

 

 

복사생성자 선언

명시적으로 복사생성자를 호출할 수 있다.

 

 

복사생성 방지

복사생성자 선언 후 구현하지 않는다.

복사하지 않았을 경우 에러가 나지 않는다.

 

복사생성 시 컴파일 에러가 난다.

 

 

묵시적 형변환 방지(explicit)

explicit 키워드를 통해 자동으로 형변환되는 것을 방지할 수 있다.

 

 

얕은 복사

player2와 player1이 모두 같은 변수의 주소를 가리키고 있다.

변수를 수정하면 두 클래스 모두 영향을 받는다.

또한 할당한 메모리를 제거하고 있지 않아 메모리 누수가 난다.

 

소멸자에서 메모리 할당을 해제하면

두 클래스의 m_iHealth값이 같으므로

먼저 소멸자가 호출된 클래스는 정상적으로 작동하지만

다음 소멸자가 호출된 클래스는 주소를 가리키고 있지만

접근 권한이 없어 런타임 에러가 나게 된다.

 

 

깊은 복사

복사 생성 시 새롭게 할당해 새로운 주소값을 가리키도록 한다.

소멸 시에도 정상적으로 메모리를 해제한다.

 

 

 

'C++' 카테고리의 다른 글

[C++] const  (0) 2023.05.13
[C++] 복사대입연산자  (0) 2023.05.12
[C++] 소멸자  (1) 2023.05.10
[C++] 생성자  (0) 2023.05.09
[C++] 오버로딩  (0) 2023.05.08

소멸자

소멸자는 객체가 소멸될 때 실행되는 메서드

 

 

특징

1. 오직 한 개 존재(인자 x)

2. 반환타입이 없다.

3. 메소드명이 클래스명과 같다.

 

 

디폴트 소멸자

소멸자가 없어도 기본소멸자가 호출된다.

 

 

명시적 디폴트 소멸자

default를 통해 명시적으로 디폴트소멸자를 사용할 수 있다.

 

 

소멸자 호출

스택에 할당 된 경우에는 스택에서 제거될 때 소멸자가 호출된다.

힙에 할당 된 경우에는 자동으로 제거되지 않는다.

 

 

delete 키워드

delete를 통하여 힙에 할당된 객체의 소멸자 호출이 가능하다.

 

 

댕글링 포인터

소멸자 호출 후 m_iHealth는 할당받은 주소값을 가리키고 있다.

main 함수가 끝나며 player의 소멸자를 호출하고

m_iHealth가 가리키고 있는 주소에 접근해 지울 때 런타임에러가 난다.

 

 

댕글링 포인터 방지

지우기 전에 포인터의 값이 nullptr인지 검사하여 안정성을 높일 수 있다.

 

 

nullptr 객체 소멸

객체가 nullptr일 경우 소멸자가 호출되지 않는다.

'C++' 카테고리의 다른 글

[C++] const  (0) 2023.05.13
[C++] 복사대입연산자  (0) 2023.05.12
[C++] 복사생성자  (0) 2023.05.11
[C++] 생성자  (0) 2023.05.09
[C++] 오버로딩  (0) 2023.05.08

+ Recent posts