[cpp][c++11] 타입 추론 (type inference)
2022. 12. 16. 15:59
Programming/C++
타입 추론 (type inference) ? 표현식의 타입을 컴파일러가 스스로 알아내는 기능 관련된 키워드로 auto와 decltype 이 있다. auto 키워드 함수의 리턴타입 추론 구조적 바인딩에 사용 표현식의 타입을 추론 non type, 즉 타입이 아닌 템플릿 매개변수의 타입 추론 함수에 대한 또다른 문법으로 사용 제네릭 람다 표현식에서 사용 컴파일 시간에 자동으로 추론해서 결정됨 auto로 표현식의 타입을 추론하면 함수에 지정된 레퍼런스나 const 한정자가 제거됨 복제 방식으로 전달되지 안헥 하려면 auto&나 const auto& 타입으로 지정해야 함 const std::string message = "TEST"; const std::string& foo() { return message; ..
[cpp][c++11] noexcept 키워드
2022. 12. 16. 15:54
Programming/C++
정의 noexcept가 지정된 함수는 익셉션을 던지지 않는다. 예문 int testfunc() noexcept; 추가 내용 noexcpet키워드가 지정된 함수에 익셉션을 던지는 코드가 있다면 c++런타임은 terminate()를 호출하여 프로그램 종료 파생클래스에서 virtual함수를 오버라이드할때 베이스클래스에 정의된 메서드에 noexcept가 지정되어 있지않더라도, 오버라이드 하는 함수에서 noexcept를 지정할 수 있다. 하지만 반대는 불가능하다.
[cpp] 전방 선언에 대하여
2022. 12. 2. 18:33
Programming/C++
전방 선언(forward declarations) 과 정의(definitions) 실제로 식별자를 정의하기 전에 식별자의 존재를 컴파일러에게 미리 알리는 것이다 함수의 경우 전방선언을 하려면 함수 원형으로 사용해야 한다 전방선언을 할 경우 클래스의 존재만 인지시키는 것이기 때문에 포인터로밖에 선언하지 못한다 전방 선언을 사용하는 이유? 참조하려는 헤더파일에 변경이 생겨도 헤더파일의 재컴파일이 이루어지지 않기 때문에 효율성과 속도가 증진된다! 역참조가 되는 구조를 막기도 한다 코드 Closet.h 에 아래와 같이 선언되어있다고 보자. class Button; class Jumper { Button *pB; }; 전방 선언을 사용하지 않는다면 Closet.cpp는 이렇게 사용해야한다. #include "Cl..
[cpp][effective_c++_19] 클래스 설계는 타입 설계와 똑같이
2022. 12. 1. 19:09
Programming/C++
좋은 클래스를 설계하기 위한 여러 가지 질문들 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가? 객체 초기화는 객체 대입과 어떻게 달라야 하는가? 초기화와 대입을 헷갈리지 않는게 가장 중요함, 각각에 해당되는 함수 호출이 아예 다르다 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가? 어떤 타입에 대해 값에의한 전달을 구현하는 쪽은 복사 생성자이다 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 가질 것인가? 기존의 클래스 상속에 맞출 것인가? 이미 갖고 있는 클래스로부터 상속을 시킨다면, 당연히 이번에 설계한 클래스는 이녀석들에 의해 제약을 받게 된다. 특히 멤버함수가 가상인가 비가상인가 여부가 가장 크다. 이번에 설계하는 클래스를 다른클래스..
[cpp][effective_c++_18] 인터페이스 설계는 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게
2022. 11. 23. 01:06
Programming/C++
함수도 인터페이스,클래스도 인터페이스,템플릿 또한 인터페이스요.... 사용자가 의도한 대로 동작하지 않는다면 그 코드는 컴파일 되어야 하지 않는 것이 맞다. 또한, 어떤 코드가 컴파일된다면... 사용자가 원하는 대로 동작해야한다. '제대로 쓰기는 쉬우나 엉터리로 쓰기엔 어려운' 인터페이스를 개발하려면 우선 사용자가 저지를 만한 실수를 머리에 넣어 두고 있어야 한다. 예를 들면, 날짜를 저장하는 클래스의 생성자를 설계해보자 class Date{ public: Date(int month, int day, int year); ... }; 여기엔 사용자가 저지를 만한 실수가 있다! 매개변수의 전달 순서를 잘못쓰거나,유효 범위를 넘어서는 숫자가 들어갈 수 있다. 1. Date date(30,3,1999) ->mo..