CS/C++
-
C++에서는 네 가지 유형의 캐스트 연산자가 있으며, 각각은 서로 다른 목적과 사용 사례에 대해 설계되어 있다. 이들 캐스트 연산자는 타입 변환을 수행하며, 특정 캐스트 연산자는 추가적인 런타임 검사를 제공한다. static_cast: static_cast는 컴파일 타임에 타입 변환을 수행한다. 관련된 타입 간의 변환에 사용된다(예: 기본 타입 간의 변환, 상속된 클래스 간의 포인터 변환). float f = 10.5; int i = static_cast(f); // float에서 int로 변환 reinterpret_cast: reinterpret_cast는 바이트 레벨에서 타입 변환을 수행한다. 서로 관련이 없는 타입 간의 변환에 사용된다. 이것은 위험할 수 있으며, 제대로 사용되지 않으면 정의되지 않..
C++ 의 캐스팅C++에서는 네 가지 유형의 캐스트 연산자가 있으며, 각각은 서로 다른 목적과 사용 사례에 대해 설계되어 있다. 이들 캐스트 연산자는 타입 변환을 수행하며, 특정 캐스트 연산자는 추가적인 런타임 검사를 제공한다. static_cast: static_cast는 컴파일 타임에 타입 변환을 수행한다. 관련된 타입 간의 변환에 사용된다(예: 기본 타입 간의 변환, 상속된 클래스 간의 포인터 변환). float f = 10.5; int i = static_cast(f); // float에서 int로 변환 reinterpret_cast: reinterpret_cast는 바이트 레벨에서 타입 변환을 수행한다. 서로 관련이 없는 타입 간의 변환에 사용된다. 이것은 위험할 수 있으며, 제대로 사용되지 않으면 정의되지 않..
2023.11.01 -
inline 함수와 #define 매크로 함수는 코드에서 유사한 작업을 수행할 수 있지만, 구문, 기능 및 처리 방식에 많은 차이가 있다. 다음은 inline 함수와 #define 매크로의 주요 차이점이다: 정의 방식: inline 함수는 일반 함수와 같이 정의되며, 인자와 반환 타입을 가진다. #define 매크로는 전처리기 지시자를 사용하여 정의되며, 인자와 반환 타입이 명시적으로 정의되지 않는다. // inline 함수 예제 inline int add(int a, int b) { return a + b; } // #define 매크로 예제 #define ADD(a, b) ((a) + (b)) 타입 검사: inline 함수는 컴파일 타임에 정적 타입 검사를 제공한다. #define 매크로는 타입 검사..
inline 함수와 매크로 함수의 차이inline 함수와 #define 매크로 함수는 코드에서 유사한 작업을 수행할 수 있지만, 구문, 기능 및 처리 방식에 많은 차이가 있다. 다음은 inline 함수와 #define 매크로의 주요 차이점이다: 정의 방식: inline 함수는 일반 함수와 같이 정의되며, 인자와 반환 타입을 가진다. #define 매크로는 전처리기 지시자를 사용하여 정의되며, 인자와 반환 타입이 명시적으로 정의되지 않는다. // inline 함수 예제 inline int add(int a, int b) { return a + b; } // #define 매크로 예제 #define ADD(a, b) ((a) + (b)) 타입 검사: inline 함수는 컴파일 타임에 정적 타입 검사를 제공한다. #define 매크로는 타입 검사..
2023.11.01 -
std::string은 일반적으로 동적 할당 배열(dynamic allocation array)를 사용하여 문자열 데이터를 저장한다. std::string의 구현은 C++ 표준 라이브러리에 따라 다를 수 있지만, 대부분의 구현에서 std::string은 내부적으로 동적 할당 메모리를 사용하여 문자열 데이터를 저장하고 관리한다. 이렇게 동적 메모리를 사용하면 문자열의 크기가 런타임에 변경될 수 있게 해준다. std::string의 일반적인 구현은 다음과 같은 멤버 변수를 포함할 수 있다: Data Pointer: 동적 할당된 메모리의 시작 주소를 저장하는 포인터다. 이 포인터는 문자열 데이터를 저장하는 배열을 가리킨다. Size: 현재 문자열의 길이를 저장한다. Capacity: 동적 할당된 메모리의 전체..
std::string 은 동적 할당 배열이다!std::string은 일반적으로 동적 할당 배열(dynamic allocation array)를 사용하여 문자열 데이터를 저장한다. std::string의 구현은 C++ 표준 라이브러리에 따라 다를 수 있지만, 대부분의 구현에서 std::string은 내부적으로 동적 할당 메모리를 사용하여 문자열 데이터를 저장하고 관리한다. 이렇게 동적 메모리를 사용하면 문자열의 크기가 런타임에 변경될 수 있게 해준다. std::string의 일반적인 구현은 다음과 같은 멤버 변수를 포함할 수 있다: Data Pointer: 동적 할당된 메모리의 시작 주소를 저장하는 포인터다. 이 포인터는 문자열 데이터를 저장하는 배열을 가리킨다. Size: 현재 문자열의 길이를 저장한다. Capacity: 동적 할당된 메모리의 전체..
2023.11.01 -
explicit explicit 키워드는 주로 생성자와 변환 연산자에 사용되며, 해당 생성자나 변환 연산자가 암시적 변환(implicit conversion)을 허용하지 않도록 지정한다. 예를 들어, explicit 키워드가 없는 생성자를 가진 클래스가 있을 때: class Test { public: Test(int x) {} }; void func(Test t) {} int main() { func(42); // int에서 Test로 암시적 변환 가능 } 위의 코드는 func(42)에서 int 타입의 42가 Test 타입으로 암시적 변환되어 func 함수에 전달된다. explicit 키워드가 생성자에 지정된 경우: class Test { public: explicit Test(int x) {} }; v..
explicit 키워드explicit explicit 키워드는 주로 생성자와 변환 연산자에 사용되며, 해당 생성자나 변환 연산자가 암시적 변환(implicit conversion)을 허용하지 않도록 지정한다. 예를 들어, explicit 키워드가 없는 생성자를 가진 클래스가 있을 때: class Test { public: Test(int x) {} }; void func(Test t) {} int main() { func(42); // int에서 Test로 암시적 변환 가능 } 위의 코드는 func(42)에서 int 타입의 42가 Test 타입으로 암시적 변환되어 func 함수에 전달된다. explicit 키워드가 생성자에 지정된 경우: class Test { public: explicit Test(int x) {} }; v..
2023.11.01 -
중괄호 초기화 (Brace Initialization): C++11부터 소개된 중괄호 초기화는 객체의 초기화 방법을 통일하고자 도입되었다. 이 방식의 장점: 일관된 문법: 동일한 중괄호 {} 문법을 사용하여 변수, 객체, 배열, STL 컨테이너 등을 초기화할 수 있다. narrowing conversion 방지: {}를 사용하여 초기화할 때 형 변환이 수행되지 않거나 값의 손실이 발생하지 않도록 한다. int i{3.14}; // 컴파일 오류. narrowing conversion 방지 기본 생성자와 동일한 문법: 중괄호를 사용하여 기본 생성자를 호출하는 것도 가능하다. std::vector vec{}; // 비어 있는 벡터 생성 다양한 초기화 방법들 C++에서는 여러 가지 방법으로 변수나 객체를 초기화..
중괄호 초기화와 다양한 초기화 방법중괄호 초기화 (Brace Initialization): C++11부터 소개된 중괄호 초기화는 객체의 초기화 방법을 통일하고자 도입되었다. 이 방식의 장점: 일관된 문법: 동일한 중괄호 {} 문법을 사용하여 변수, 객체, 배열, STL 컨테이너 등을 초기화할 수 있다. narrowing conversion 방지: {}를 사용하여 초기화할 때 형 변환이 수행되지 않거나 값의 손실이 발생하지 않도록 한다. int i{3.14}; // 컴파일 오류. narrowing conversion 방지 기본 생성자와 동일한 문법: 중괄호를 사용하여 기본 생성자를 호출하는 것도 가능하다. std::vector vec{}; // 비어 있는 벡터 생성 다양한 초기화 방법들 C++에서는 여러 가지 방법으로 변수나 객체를 초기화..
2023.11.01 -
lvalue와 rvalue, 그리고 move에 대한 개념은 C++에서 객체와 리소스 관리를 이해하는데 중요하다. 이들 각각의 개념을 메모리 관점에서 살펴보자 lvalue (Left Value) lvalue는 메모리에 지속적으로 위치한 객체를 나타낸다. lvalue는 변수 이름과 같이, 메모리 주소를 가지고 있어 해당 주소에 접근하거나 값을 변경할 수 있다. 예를 들어, int x = 10;에서 x는 lvalue다. rvalue (Right Value) rvalue는 일반적으로 임시 객체나 값으로, 메모리에 지속적인 위치를 가지지 않는다. rvalue는 일반적으로 표현식의 결과나 리터럴 값 등으로 생성되며, 그 수명은 매우 짧다. 예를 들어, 5, x + y, std::move(x) 등은 rvalue이다...
lvalue, rvalue, move 그리고 RVOlvalue와 rvalue, 그리고 move에 대한 개념은 C++에서 객체와 리소스 관리를 이해하는데 중요하다. 이들 각각의 개념을 메모리 관점에서 살펴보자 lvalue (Left Value) lvalue는 메모리에 지속적으로 위치한 객체를 나타낸다. lvalue는 변수 이름과 같이, 메모리 주소를 가지고 있어 해당 주소에 접근하거나 값을 변경할 수 있다. 예를 들어, int x = 10;에서 x는 lvalue다. rvalue (Right Value) rvalue는 일반적으로 임시 객체나 값으로, 메모리에 지속적인 위치를 가지지 않는다. rvalue는 일반적으로 표현식의 결과나 리터럴 값 등으로 생성되며, 그 수명은 매우 짧다. 예를 들어, 5, x + y, std::move(x) 등은 rvalue이다...
2023.10.31