C 에서는 printf("%positive진법uppercaseshowbaseleft/internal/rightshowpointfixed, scientificboolalpha함수 형식이다.setwsetw로 뭔가 채우기 위해서는 적어도 빈문자열이라도 출력 해야 한다.한번만
안전하지 않음어느정도 대체함 그러나 "cin 도 scanf 처럼 메모리 경계를 검사하지 않아서 여전히 위험한 코드이다, 데이터를 주는대로 받고 메모리를 벗어나서 기록한다."c 에서는 fgets나 sscanf같은 경계 검사 함수를 사용한다C++ 은 다음과 같이 해결한다"
초기 C++에서 정착된 표준들을 고대 C++이라 함(모던 c++ 을 말하는 것이 아니다)C에서 새로 추가된 것들참조bool엄밀히 말하면 고대에 온것이 아니라 모던에 들어온 것임개체지향 프로그래밍참조참조는 성능의 이점은 취하면서 포인터를 사용하면서 발생 할 수 있는 위험
std::string 클래스를 이용한 문자열은 길이가 증가할 수 있음문자열 연산을 위한 다양한 연산자를 제공다양한 함수 제공str.size(), str.length() : 문자열 길이 반환('length는 잘 사용하지 않음')c_str() :옛날 방식의 문자열 반환해당
ifstream 파일 입력 get, getline, operator>>() 함수 존재 EX get \n은 스트림에 남긴채 문자열을 읽어옴 한 문자 읽기 가능 getline \n을 스트림에서 버리고 문자열을 읽어옴, \n을 읽어와서 buffer에 저장하는게
C, Java에는 없음클래스에 복사 생성자가 없는 경우, 컴파일러가 암시적 복사 생성자를 자동 생성암시적 복사 생성자는 얕은 복사함반환시 복사 발생 할 수 있음 단 컴파일 최적화(RVO)시 복사 발생하지 않음매개변수 목록을 제외하고는 모든 게 동일반환형을 다르게 해서
다른 개발자들은 상속을 많이 사용 할까?C++ 에서는 상속을 할 때는 대부분 public 상속을 함사실 private나 protected 상속은 거의 사용 안한다고 봐도 무방Java는 다음과 같이 호출 가능 하다C++은 왜 부모 클래스의 이름을 알아서 Animal(ag
OOP에서는 friend는 안티 패턴 그러나 frined가 필요한 경우가 있음... 캡슐화 되어 외부로 보여주지 않아야 하는데... 시나리오 어떤 큰 덩어리 클래스가 있음, 너무 커서 나누고 싶음 나눴음, 그런데 서로 나눈 모듈끼리 인터페이
class TA : public Student, public FacultyStudent, Faculty 순서로 호출class TA : public Student, public Faculty : Faculty(), Student()초기화 리스트 생성 순서와 상관 없음Ja
컴파일러가 알아서 처리static_cast컴파일 시점에 코드를 봐서 캐스팅이 불가능 할 것 같은 경우 컴파일 에러 발생가능한 경우 캐스팅 해줌const_castconst 변수를 일반 변수로 캐스팅, const 를 벗겨버리는 캐스팅dynamic_cast(c++ 98)RT
스택 프레임이 생성되고 해제되는 과정이 진행함수 코드로 점프, 함수 코드에서 부터 리턴 되는 과정그래서 좀더 느림CPU 캐시에 최적이 아닐 수 도 있음"- 최근에 사용한 메모리는 캐시에 있는데, 멀리 있는 코드일 수 록 캐시에 없는 경우가 있을 수 있다."모던 CPU
다른 파일의 전역 변수에 접근 가능범위의 제한을 받는 전역 변수, only 전역 변수랑은 좀 다르다.범위파일 속네임스페이스 속클래스 속함수 속static은 외부 파일에서 접근 불가능 하다정적 멤버 변수는 클래당 하나의 COPY만 존재클래스 메모리 레이아웃에 존재exe
c++에도 예외 처리가 있지만 중요성이 떨어짐자바는 모든게 exception예외 사용은 모든 언어에서 너무 남용되고 있다if로 처리될 수 있는데도 불구하고예외로 부터 안전한 코드를 짜기 힘들다사람의 생각은 선형적이다.C++ 자체에서 예외는 없다, 단 프로그래머가 만드것
실무에서 많이 사용어떤 자료형도 넣을 수 있는 동적 배열그 안에 저장된 모든 요소들이 연속된 메모리 공간에 위치(Sequence Container)요소 수가 증가함에 따라 자동으로 메모리를 관리해 줌어떤 요소에도 임의로 접근(random access) 가능"한마디로 메
Key를 이용해 데이터를 가져옴key와 값의 쌍들을 저장Key는 중볼될 수 없음C++ 맵은 자동 정렬되는 컨테이너 ... ??? <-- unordered map 존재함.이진 탐색 트리(binary search tree) 기반오름 차순O(logN)map은 Hash
First In First Out, 선입선출, 자료 구조push() : 데이터 삽입pop() : 데이터 제거front() : 가장 앞의 요소를 참조로 반환pop_front()back() : 가장 뒤의 요소를 참조로 반환size() : queue의 크기 반환empty()
vector에 비해 상대적으로 사용할 일이 적음양방향 연결 리스트front, back 참조자 존재operator\[]가 없음양쪽 끝에서 삽입 가능reserve가 없음, 메모리를 할당하는 개념이 아님reserver가 있으면 사용 하는것이 좋음position이 가리키는 위
std::vector scores;컴파일러가 vector를 읽어서 자동으로 만듬템플릿은 코드를 자료형마다 중복으로 작성하지 않아도 됨컴파일 도중에 실제 필요한 코드를 컴파일러가 작성해서 실행 되게끔 만들 수 있다.템플릿 함수 정의템플릿 함수 사용템플릿에 넣는 자료형 가
생각보다 사용할 일이 없다굳이 사용한다면 sort랑 find정도(find도 자체에 있는데...)...?,요소 범위에서 쓸 수 있는 함수들\[처음, 마지막)처음 <= X < 마지막배열 또는 몇몇 STL 컨테이너에 쓸 수 있음.반복자를 통해 컨테이너에 접근반복자
조건이 부합되지 않으면 '컴파일'이 되지 않도록 해줌(기존의 assert는 런타임 중에 문제 발생하면 브레이크 포인트 걸음)assert(name != NULL)call stack이 굉장히 보기 않좋아서 직접 만들어 사용하는 회사도 있음.어서션(assert)실행 중에 가
문제 1) 암시적 생성자문제 2) 빈 생성자 만들기위 문제를 default 키워드로 해결 할 수 있다.default 키워드를 사용하면, 컴파일러가 특정한 생성자, 연산자 및 소멸자를 만들어 낼 수 있음그래서 비어 있는 생성자나 소멸자를 구체화할 필요가 없음또한 기본 생
상속 안 해줄꺼야!상속을 맊을 방법이 없음, 어떤 클래스든 상속을 해 갈 수 있음.요새는 상속을 안 하는것이 추새이다.solution 1)solution 2)solution 3)final 키워드클래스나 가상 함수를 파생 클래스에서 오버라이딩 못 하도록 하려면 final
멤버들의 상대적 위치 구할 수 있음offsetof 매크로매크로의 일종특정 멤버가 본인을 포함한 자료 구조의 시작점에서부터 몇 바이트만큼 떨어져 있는지 알려줌직렬화(serialize)나 역직렬화(deserialize)를 할 때 꽤나 유용
NULL을 쓰면 가끔 뭔가 굉장히 이상한 일이 벌러짐NULL vs nullptrnullptr 은 메모리 상으로는 0이지만 컴파일 중에 포인터가 아니면 에러를 발생 시켜준다.NULL대신 nullptr을 사용해야 한다. 더 이상 NULL이 있을 곳이 없다. NULL은 과거
이걸 써야 할까?선별적으로커다란 코드베이스에서는 안 쓰는 걸 추천"헤더를 변경할 때마다"헤더와 CPP가 나뉜 이유, 컴파일 시간 줄이기 위한것도 그 이유, Java나 C - 헤더를 인클루드하는 모든 .cpp파일을 다시 빌드해야 함.이 헤더를 다른 헤더들이 인클루드
std::unordered_map;말 그대로 Map, 정렬을 하지 않기 때문에 추가할 때 마다 O(1)std::map다른 언어들은 기본적으로 정렬안된 map을 사용하고 정렬된 것을 원할 때만 특별한 옵션을 취하는데 C++은 그러하지 않음이진 트리 삽입시 마다 O(log
new 사용하자 마자 delete도 같이 적는것이 좋은 습관더 이상 포인터가 필요하지 않을 때 메모리를 해제해야 함메모리 직접 해제는 가비지 컬렉션보다 빠르다.하지만 위의 코드만으로 개발자의 실수를 방지 하는데는 한계가 있음새로운 방식 필요스마트 포인터소유자가 한명 밖
rvaluelvalue임시적이지 않은것...이름이 있는 것, 변수 있는 것 ..단일 식을 넘어 지속되는 개체주소가 있음이름이 있는 변수const 변수배열 변수비트 필드(bit field)공용 구조체(unions)클래스 멤버좌측값 참조(&)로 반환하는 함수 호출문자열 리
템플릿 굉장히 남용다소 흥미로운 템플릿 메타 프로그래밍 예제템플릿 특수화 처리int x = Fibonacci<45>::value;// 컴파일 시에 계산에서 값 대입!! 몇몇 경우에는 컴파일 계산이 오래 걸리면 컴파일 멈춘다.왜 위와 같은 프로그래밍을 할 까???컴
다른 언어에 많이 포함되어 있음잘못 사용할 경우 가독성을 해침이름이 없는 함수 개체(언어의 시점에서 메모리를 잡아 먹는것, 클래스의 개체 아님...)내포(nested) 되는 함수Ex) 이전의 벡터 정렬하기Ex) 새로운 벡터 정렬하기람다식을 품는 범위(scope)안에 있
C++17의 새로운 라이브러리C++14나 그 전에는 파일 시스템과 다음과 같은 구성요소에 대해 연산을 할 방법이 없었음경로(path)일반 파일디렉터리(directory)파일 읽기와 쓰기에 관한 라이브러리가 아님파일 속성 변경, 디렉터리 순회, 파일 복사 등에 관한 라이
"https://en.cppreference.com/w/cpp/thread"윈도우 쓰레드POSIX 쓰레드(Linux)C++11 전까지 표준 멀티쓰레딩 라이브러리가 없었음OS마다 멀티쓰레딩 구현이 달랐음리눅스/유닉스: POSIX 쓰레드(pthreads)윈도우 쓰
출력이 섞인다...해결책) 공유자원 잠그기std::mutex::lock()뮤텍스를 잠근다.동일한 쓰레드에서 두 번 잠그면 데드락(deadlock) 발생꼭 그렇게 해야 된다면, std::recursive_mutex를 사용, 재귀 함수 같은데에서 많이 사용std::mute
private : 자신의 클래스 내에서만 멤버 접근이 가능합니다.protected : 파생 클래스(자식 클래스)와 자신의 클래스에서만 멤버 접근이 가능합니다.public : 클래스 외부에서도 멤버 접근이 가능합니다.상속 유형에 따라 부모 클래스의 멤버들이 자식 클래스의
기본 클래스(부모 클래스)로 사용될 클래스의 소멸자는 모두 가상 소멸자로 만들자생성자는 부모 생성자가 수행되고 자식 생성자가 수행된다.소멸자는 자식 소멸자가 수행되고 부모 소멸자가 수행된다.student1의 정적 타입이 Student이고 자식 소멸자와 부모 소멸자 둘다
일반적으로는 프로그래밍 할 때는 가장 적합사람은 사물을 객체로 바라본다C는 데이터와 함수가 나뉘어져 있어 이해하기 힘듬객체지향으로 물체의 상태(데이터),동작(함수) 등을 표현하기 쉽다객체와 객체간의 조합 하여 새롭게 추상화된 객체를 볼 수 있다.객체 지향 이외에 특화된
예약된 메모리 공간(보통 1mb) 이하, 컴파일 시점에 컴파일러가 스택을 얼마만큼 할당 할 지 지정함.컴파일러 옵션으로 할당할 스택 메모리 크기 지정 가능함수 호출과 반환이 이 메모리에서 일어남단순히 스택 포인터를 옮김사용자가 메모리를 할당 및 해제할 필요가 없음스택에
C++ 대입C++ 초기화클래스에 생성자가 없으면 컴파일러가 기본 생성자를 자동적으로 만들어 줌객체가 객체를 가지고 있을 때???Java포함된 객체에 걍 NULL로 초기화 함C++'포함된 객체의 기본 생성자를 호출해 초기화 해줌', null이 아님.소멸자로 class에서
어셈블리 내에서는 구조체와 클래스가 같은 데이터 그룹일 뿐이라서 컴퓨터가 구분 못함컴파일러는 구분 함.구조체 기본 접근권한struct - pubilc클래스 기본 접근권한class = private둘의 차이점은 없다, 컴파일러 입장에서는 둘의 차이점을 모른다함수를 넣어야
C, Java에는 없음클래스에 복사 생성자가 없는 경우, 컴파일러가 암시적 복사 생성자를 자동 생성암시적 복사 생성자는 얕은 복사함반환시 복사 발생 할 수 있음 단 컴파일 최적화(RVO)시 복사 발생하지 않음
매개변수 목록을 제외하고는 모든 게 동일반환형을 다르게 해서 오버로딩 할 수 없음.
알아서 캐스팅 해서 함수 호출함함수 매칭 순서
C++ 사용시 암시적인 형변환으로 인하여 예측하지 못한 동작이 발생하는 경우가 있다.암시적인 형 변환은 컴파일러가 현재 가장 일치하는 타입으로 자동으로 변환하여 처리하는 동작을 말한다.printA(n) 호출시 A(26) 생성자를 호출하여 객체를 생성한 다음 printA
main.chello.h이 파일이 시스템이 지정한 장소에 있음을 의미이 파일이 현재 파일 기준으로 지정한 장소에 있음을 의미hello.h 파일도 \`컴파일시 include 위치를 지정하면 가능컴파일시 헤더 파일 위치를 현재 디렉터리로 지정
이름 옆에 \*, \[], () 가 붙으면 포인터로 해석된다.\* 와 \[] 해석시 \[]가 먼저 해석 된다는 것을 주의해야 한다.\* 와 () 해석시 ()가 먼저 해석 된다는 것을 주의해야 한다.다차원 배열을 가르키는 포인터는 일반적으로 다음과 같이 끝에만 배열 길이
EXPECT_CALL()을 이용하여 mock 객체에 함수 호출을 설정 하는 것은 이 함수가 호출이 된것이 아니라 미래에 호출이 발생할 것이라는 예측이다한 테스트 내에서 EXPECT_CALL 여러번 호출하면 실패할 수 있다.기대치(expection)을 너무 업격하게 하면
googletest에서 제공하는 mock 객체mock 객체는 테스트전 미리 동작이 정의 되어 테스트 실행시 정의된 동작을 수행한다.미리 동작을 정의하는 과정에서 호출 하려는 메소드, 메소드 호출 순서, 호출 횟수, 인자, 반환 값을 정의할 수 있다.mock 객체는 st
RB 트리로 구현되어 있음hash로 구현되어 있음O(n)의 메모리 사용량을 보이며 갯수가 일정이상 넘어서면 rehasing 작업을 수행