본문 바로가기

C,C++30

[C, C++] type conversion 형 변환 형 변환 한 자료형에서 다른 자료형으로 값을 변환하는 것 암시적 형 변환(implict type conversion): 즉 컴파일러가 자동으로 하나의 기본 자료형을 다른 자료형으로 변환한다. 자동 형 변환(automatic type conversion)이라고 불린다. 명시적 형 변환(explict type conversion): 형 변환을 하기 위해 형 변환 연산자(type casting operator)를 사용한다. 의도치 않은 형 변환은 오류를 원인중 하나이기 때문에 되도록 피해야 하고 될 수 있으면 명시적 형변환을 사용해야한다. explicit 암시적 타입 변환을 수행하는데 쓰이지 않게 하는 키워드 class A { public: explicit A(int x = 0, bool b = true); .. 2022. 5. 3.
[C++] class의 메모리 할당방법 (virtual 멤버함수, 일반멤버함수, 상속) 여러 가지 class의 메모리 할당에 대해 알아보겠습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include using namespace std; class Person{ public: char name; char address; }; int main() { Person gildong; cout 2019. 11. 5.
[C, C++] #include <헤더파일>과 #include "헤더파일"의 차이 #include 과 #include "헤더파일"의 차이에 대해 알아보겠다. 어떤 헤더파일은 꺽쇠로 표시하고 어떤 것은 " "로 표시하는지 문득 궁금증이 들었다. 결론부터 말하면 둘의 주요한 차이점은 해당 헤더파일이 존재하는 경로의 차이이다. #include 컴파일러가 설치된 폴더에서 헤더 파일을 찾으라는 지시이다. 예를 들어서 iostream이나 stdio.h와 같은 헤더파일은 컴파일러와 같은 폴더에 같이 위치해 있다. 같은 경로에 있는 것이다. 따라서 꺽쇠로 표시해줘서 같은 경로에서 찾으라는 명령이다. #include "헤더파일" 사용자의 프로젝트 폴더나 개발자가 추가포함 디렉터리로 지정해준 경로에서 찾으라는 명령이다. 개발자가 만든 헤더파일이나 추가로 외부 라이브러리를 포함하고 싶은 경우 위와 같은 .. 2019. 10. 23.
[C++] 공백이 포함된 문자열 입력받기(char array, string : getline) C, C++에서 입력을 받을 때 "공백이 포함된 문자열"을 입력받는 법을 소개한다. Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include #include using namespace std; int main(){ //string string str; getline(cin, str); //getline(cin, str, '\n'); cout 2019. 10. 23.
[C++] 문법 char to string , string to char 변환 문법 char to string , string to char 변환 1. char to string으로 변환하는 방법 string의 생성자를 이용, 생성 할 때 인자로 넘겨서 생성하는 방법 char배열의 이름을 사용해 대입연산자를 이용해 대입해주는 방법 2. string to char로 변환하는 방법 c_str()함수를 이용 해 string을 char로 변환시키고 그 값을 strcpy를 이용, 다른 char값에 복사하는 방법 EXAMPLE #include #include using namespace std; int main(){ //char to string char ch[10] = "hello"; string str1(ch); string str2=" "; str2=ch; cout 2019. 10. 16.
[C++, STL] <algorithm> std::fill 함수 사용하기 (feat. std::vector, 1차원 배열, 2차원 배열 초기화) std::fill 1 2 template void fill (ForwardIterator first, ForwardIterator last, const T& val); cs 헤더파일에 저장되어 있다. 값으로 범위(first, last)를 채우는 역할을 하는 함수이다. 인자 (Parameters) first, last val의 값으로 채울 범위를 나타내는 반복자들 [first, last)범위에 값이 채워지게 된다. first는 포함하지만 last는 포함하지 않는다. val 범위에 채울 값 리턴값 (return value) 없다. 예제 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253.. 2019. 9. 25.
[Effective C++]항목 17 : new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자. 요약 new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들자! 아니면 예외가 발생될 때 디버깅하기 힘든 자원 누출이 초래될수 있다.! 쉽게 말해서 다음과 같은 코드에서 processWidget(std::tr1::shared_ptr(new Widget), priority()); 컴파일러는 priority를 호출하고 new Widget을 실행하고 tr1::shared_ptr 생성자를 호출 하는 3가지 일을 하는데 컴파일러에 따라 위 순서가 뒤죽박죽 될 수 있으니 std::tr1::shared_ptr pw(new Widget); //new로 생성한 객체를 스마트 포인터에 담는 코드를 하나의 독립적인 문장으로 만든다. processWidget(pw, priority); 위와 같이 명시적으.. 2019. 8. 6.
[Effective C++]항목 15 : 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자. 요약 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 만들때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어 주어야 한다. 자원 접근은 명시적 변환 혹은 암시적 변환을 통해 가능하다. 안전성만 따지면 명시적 변환이 대체적으로 더 낫지만, 편의성을 놓고 보면 암시적 변환이 괜찮다. class Investment {//여러 형태의 투자를 모델링한 투자 클래스들의 최상위 클래스 public: bool isTaxfree() const; ... }; Investment* createInvestment();//팩토리 함수 std::tr1::shared_ptr pi1(createInvestment());//tr1::shared_ptr이 자원관리를 맡도록 합니다.. bool t.. 2019. 8. 5.
[Effective C++] 항목 19 : 클래스 설계는 타입 설계와 똑같이 취급하자. 오늘은 클래스 설계를 할 때 고려해야할 사항에 대해 알아보도록 하자. 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가? 이부분이 어떻게 되느냐에 따라 클래스 생성자 및 소멸자의 설계가 바뀐다. 객체 초기화는 객체 대입과 어떻게 달라야 하는가? 각각 생성자와 대입 연산자에 의해 이루어지기 때문에 중요한 요소라 할 수 있다. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가? 여기서 잊지말아야 할 포인트는 값에 의 한 전달을 구현하는 것은 바로 복사생성자라는 것이다. 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 잡을 것인가? 기존의 클래스 상속 계통망에 맞출 것인가? 어떤 종류의 타입 변환을 허용할 것인가? 어떤 연산자와 함수를 두어야 의미가 .. 2019. 8. 1.
[Effective C++] 항목 13 : 자원 관리에는 객체가 그만! auto_ptr과 tr1::shared_ptr에 대해서 서술되어 있는데 현재 auto_ptr은 사라진 상태이므로 그냥 그 이후에 적용된 스마트포인터 중 유니크 포인터에 대해서 서술하겠다. auto_ptr이 왜 사라진 이유는 배열의 포인터를 해제할 때 배열 객체가 모두 제대로 해제되지 않는다는 것과 복사 대입 연산시 실제로는 복사가 되지 않는다는 것이다. 이러한 문제점들을 보완하기 위해 C++11 표준에서는 새로운 스마트 포인터들이 포함됐다. 그리고 이동 시맨틱이 추가되었다. 이동 시맨틱은 객체를 복사하지 않고 이동시킨다. 이동 후에 객체의 소유권은 당연히 대입된 쪽이 가진다. 복사 시맨틱일 경우, STL 컨테이너 중 리스트나 벡터는 동적 배열이기 때문에 상황에 따라 그 메모리 크기가 두배까지 늘어난다. .. 2019. 7. 31.
[Effective C++] 항목 12 : 객체의 모든 부분을 빠짐없이 복사하자. 요약 객체 복사 함수는 주어진 객체의 모든 데이터 멤버 및 모든 기본 클래스 부분을 빠뜨리지말고 복사해야한다. 클래스의 복사 함수 두 개를 구현할 때, 한쪽을 이용해서 다른 쪽을 구현하려는 시도는 절대로 하지 마세요. 그 대신, 공통된 동작을 제 3의 함수에다 분리해 놓고 양쪽에서 이것을 호출하게 만들어서 해결하자! 좀 더 구체적으로 서술하자면 복사생성자와 복사대입연산자를 자신이 만들어서 쓴다면 포함된 모든 객체를 빠짐없이 복사하자는 이야기이다. 컴파일러가 경고도 내지 않으니 조심하자고 필자는 말한다. 또한 상속을 할때도 상속받은 클래스에서 복사대입연산자를 구현하면 상속된 클래스까지 명시적으로 해주자! 다음과 같이! PriorityCustomer::Prioritycustomer(const Priority.. 2019. 7. 30.
[Effective C++] 항목 11 : operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자. 오늘부터는 가독성을 위해 제일 처음에 요약부분을 넣도록 하겠다. 요약 operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자. 원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정할 수도 있으며, 복사 후 맞바꾸기 기법을 써도 된다. 같은 맥락으로 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 같은 객체인 경우에 정확하게 동작하는지 확인해 보자. 자기 대입이란? 어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것을 말한다. 오늘은 자기대입의 경우 발생할 수 있는 예외처리에 대해 알아본다. Widget& Widget::operator=(const Widget& rhs) { delete pb; pb = .. 2019. 7. 25.