C++: 19개의 글
C++에서 깊은 복사와 얕은 복사의 차이점을 알아보겠습니다. 간략하게 설명하면 얕은 복사는 C++에서 같은 타입의 객체를 복사할 때, 그 객체의 멤버 변수가 데이터를 가르키는 포인터라면 데이터 자체를 복사하는 것이 아닌 복사하고자 하는 객체의 멤버 변수가 가르키는 데이터를 참조하는 형식으로 복사가 진행됨을 뜻합니다. 깊은 복사는 반대로 참조하는 방식이 아닌 가르키는 데이터 그 자체를 복사하는 것이죠. 참조 자료 : http://sosal.kr/243 출처: https://engkimbs.tistory.com/148?category=688856 [새로비]
C++에서 가상함수의 동작원리는 이렇습니다. 클래스에 한 개 이상의 가상 함수가 있을 경우, 컴파일러는 실제 호출되어야할 함수의 위치 정보를 가지고 있는 가상 함수 테이블을 만들고, 클래스 객체에는 가상 함수 테이블을 위한 포인터를 추가합니다. 일반적으로 가상 함수가 있는 객체는 가상 함수 테이블에 있는 함수만을 호출하는 원칙을 가지고 있습니다. 가상 함수의 단점은 다른 블로거 분의 자료를 참고 했는 데 첫 번째로 가상함수를 쓰면 가상함수 테이블을 만들기 때문에 메모리 공간의 소모가 일어나게 된다는 것, 두번째로 직접 메소드에 엑세스 하는 것이 아니라 가상함수 테이블을 거쳐서 간접적으로 접근하기 때문에 속도면에서 느려질 수 있다는 단점이 있다고 합니다. 참고 자료: http://pacs.tistory.c..
C++11부터 지원하는 람다식은 익명 함수를 정의하는 식입니다. 익명 함수는 람다라고 불립니다. 익명 함수, 즉 람다는 함수의 몸체는 있지만 이름이 없습니다. (어떤 책을 읽어보면 람다식은 "변수에 저장할 수 있는 로직이다"라고 정의합니다.) 람다식은 함수 포인터와 함수 객체에 비해 다음과 같은 장점이 있습니다. 1. 코드 상으로 별도의 클래스를 구현하지 않아도 된다. 2. 변수의 상태 유지가 가능하다. 다음은 람다 함수의 예시입니다. sort(x, x+n, [](float a, float b){ return (abs(a) > abs(b)); }); STL의 predicate 부분에 람다 함수를 작성함으로써 sort 함수가 어떤 기준으로 정렬할 것인 지를 명시했습니다. 아래는 MSDN에 있는 람다식 구문..
vector는 C++ STL에서 쓰이는 선형 자료구조입니다. 이 vector를 쓸 때는 주의해야할 점이 있습니다. 바로 vector를 다른 vector에 대입할 때죠. vector는 기본적으로 다른 vector에 대입될 때 모든 요소들을 그 벡터에 복사하게 됩니다. 그럼으로써, 오버헤드가 발생하게 되죠. int main(void) { int N = 100000; vector test(N, -1); // Code for(int i=0; i< N; ++i){ vector dummy = test; } // } 위의 코드는 상당히 단순합니다. -1을 N만큼 초기화한 vector를 또 N만큼 반복하여 다른 벡터에 복사하는 코드죠. 이 코드의 수행 시간은 다음과 같습니다. [Finished in 3.8s] 만일 단..
C++에서의 시간 측정 코드 예시입니다. #include #include #include using namespace std; int main(void) { clock_t begin, end; begin = clock(); // Code // end = clock(); cout
표준 출력 시, 실수를 출력할 때 정확도를 조정하는 예제입니다. #include #include using namespace std; int main(void) { streamsize prec = cout.precision(2); cout
C++에서 :: 는 범위 지정 연산자로서 함수나 변수명 등을 namespace에 따라 구분할 때 사용됩니다. namespace는 명칭 영역이라는 말 그대로 변수나 함수들이 선언된 범위, 묶음이라고 생각하시면 됩니다. std::string 위의 string t는 std namespace영역에서의 데이터 타입 string을 쓰겠다는 의미입니다. 조금 더 살펴 보면, #include #include using namespace std; namespace A{ void hello(){ cout
C++에서 표준 입출력 코드는 다음과 같습니다. cin >> buf; 위 코드는 공백과 end-of-file 플래그를 만날 떄까지 문자들을 buffer에 저장합니다. 그리고 종료시에는 buffer에 있는 값들을 buf 변수에 저장하게 되죠. buffer에다 값을 저장하는 이유는 출력 요청 때마다 생기는 오버헤드를 줄이기 위해서 입니다. 출처: https://engkimbs.tistory.com/42?category=688856 [새로비]
템플릿은 제너릭 프로그래밍을 C++에서 구현하기 위해 도입된 개념입니다. template 키워드를 통해 구현하죠. 제너릭 프로그래밍이란 어떤 데이터의 형식에 의존하기 않고 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하여 재사용성을 높일 수 있도록 한 프로그래밍 방식이죠. 예를 들어보죠. int add(int x, int y) { return x + y; } double add(double x, double y) { return x + y } 두 수를 더하는 간단한 함수입니다. 하지만 c++에서는 실수와 정수를 표현하는 데이터 타입이 다르기 때문에 만약 각각의 데이터 타입에 맞는 함수를 구현하려면 오버로딩을 통해 각 데이터 타입에 맞는 함수를 다시 작성해야 합니다. 두 개 정도야 좀 불편하더라..