C++ 28

DALi code review - C++ 코드리딩, 람다 코드 이해하기

문제가 와서 보게 된 코드. 해결 패치가 왔지만 이해되지 않는다. 수정 내용은 대략 아래와 같음. 먼저 처음 코드부터 보자. EraseIf()의 인자로 넘겨주는 값이 이상하다. 이것은 람다 표현식이라고 한다. 대략 이러한 모습 이렇게 4가지 형태로 이루어져 있다. 각각 개시자(introducer), 인자(parameters), 반환타입(return type), 함수의 몸톰(statement)라고 한다. 아 이제 넘겨주는 인자의 형태가 보인다. 1) [] : 개시자(introducer) 2) (auto& animator) : 인자(parameters) 3) -> : 없음, 리턴타입이 void일 경우 생략 가능. 4) {return animator->Orphan();} : 함수의 몸톰. 좀더 쉬운 형태의 람..

[C++]new, delete 연산자 오버로딩

new 연산자 오버로딩Point * ptr = new Point(3, 4);기본적으로 제공되는 new 연산자가 하는 일 1) 메모리 공간의 할당 2) 생성자의 호출 3) 할당하고자 하는 자료형에 맞게 반환된 주소 값의 형 변환* 이중 3)번의 일을 수행함으로써 C에서 사용하던 malloc과 달리 new 연산자가 반환하는 주소값을 형변환할필요가 없게 된다. 기본적으로 제공되는 new 연산자가 하는 일은 위 3가지이고, 우리가 new 연산자를 오버로딩할 경우엔 위 세가지 작업중 1번에 해당하는 메모리 공간의 할당만 구현하면 된다. *new 연산자 오버로딩은 아래와 같이 오버로딩 하도록 되어있다. - 반드시 void 포인터 형 반환 - 매개변수형은 size_t Point * ptr = new Point(3,4..

[C++] 연산자 오버로딩 - 디폴트 대입 연산자

대입 연산자의 특징 - 정의하지 않으면 디폴트 대입 연산자가 삽입된다. - 디폴트 대입 연산자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다. - 연산자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다.*객체간의 대입연산은 C언어의 구조체 변수간의 대입연산과는 본질적으로 다르다. 이는 단순한 대입연산이 아닌, 대입 연산자를 오버로딩 한 함수의 호출이기 때문이다. 디폴트 대입 연산자의 문제점- 디폴트 복사 생성자의 문제점과 유사하다. 디폴트 대입 연산자는 멤버 대 멤버를 단순히 복사만 하게 된다.-> 깊은 복사를 진행하도록 정의, 메모리 누수가 발생하지 않도록, 깊은 복사에 앞서 메모리 해제의 과정을 거친다.123456789Person& operator=(const Perso..

[C++] const, friend 키워드

const- 객체도 상수화 가능하며, 이는 const 멤버함수의 호출만 허용한다. -> 데이터를 변경시킬 능력이 있는 함수는 아예 호출을 허용하지 않는다. const SoSimple sim(20); - const의 선언유무도 함수 오버로딩의 조건에 해당 -> const로 선언된 객체는 const가 선언된 함수가 호출된다. void SimpleFunc() { ... } void SimpleFunc() const { .... } friend - 클래스를 대상으로 friend선언을 하게되면 선언한 클래스의 private 변수에 직접 접근이 가능하다.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#i..

[C++] 복사 생성자의 호출시점

- 복사생성자 : Link - 복사생성자의 깊은복사 & 얕은복사 : Link복사 생성자의 호출시점- 복사 생성자의 호출시점은 크게 세가지로 구분 1) 기존에 생성된 객체를 이용해 새로운 객체를 초기화 하는 경우 2) Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우 3) 객체를 반환하되, 참조형으로 반환하지 않은 경우 1) 기존에 생성된 객체를 이용해 새로운 객체를 초기화 하는 경우 12Person man1("Lee dong woo", 29);Person man2 = man1;cs2) Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우123456789101112131415161718192021222324252627282930313233#include..

[C++] 복사생성자의 깊은복사 & 얕은복사

복사 생성자 : http://huiyu.tistory.com/341*디폴트 복사 생성자는 멤버 대 멤버의 복사를 진행한다. 이러한 방식의 복사를 가리켜 '얕은 복사'라 하는데, 이는 멤버변수가 힙의 메모리 공간을 참조하는 경우에 문제가 된다.*디폴트 복사 생성자의 문제점123456789101112131415161718192021222324252627282930313233343536373839404142#include #include using namespace std; class Person{private: char * name; int age;public: Person(char * myname, int myage) { int len = strlen(myname) + 1; name = new char[l..

[C++] 복사 생성자(Copy Constructor)

- C++ 스타일 초기화 int num = 20; int &ref = num;or int num(20); int &ref(num);-> C++에서는 위의 두가지 초기화 방식을 동시에 지원한다. *객체에서는? -> 객체에서도 변수의 초기화와 같이 대입, 괄호 두가지 초기화 방식을 모두 지원한다.1234567891011121314151617181920212223class SoSimple{private: int num1; int num2; public: SoSimple(int n1, int n2) : num1(n1), num2(n2) {} void ShowSimpleData() { cout