목록2022/01 (14)
Brise
// 3_예제 #include // Swap를 만들어 봅시다. // 1. C 버전 /* void Swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } */ // 2. C++ 레퍼런스 사용 /* void Swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } */ // 3. 템플릿 도입 template void Swap(T& a, T& b) { T tmp = a; a = b; b = tmp; } int main() { double x = 3.4, y = 2.1; //Swap(&x, &y); Swap(x, y); std::cout
// 2_메모리할당 - 52 page #include // malloc new // 함수 연산자 // void* 반환 정확한 타입으로 반환 // free 해지 delete 해지 // 생성자 호출안됨 생성자 호출 // 실패시 0반환 실패시 예외 발생 int main() { // C 스타일 int* p = (int*)malloc(sizeof(int) * 20); free(p); // C++ 스타일 int* p2 = new int; delete p2; int* p3 = new int[20]; // 배열로 할당 delete[] p3; // delete 가 아니라 delete[] 로 반환 //delete p3; // undefined(미정의 동작) 발생 } 객체 지향 언어인 C++에서는 malloc 뿐만 아니라 ..
C에서 C++로 넘어오게 되면서 큰 차이를 느끼는 문법 중의 하나가 바로 reference의 존재이다. reference의 경우 변수에 대한 별명을 부여하여 사용은 변수처럼, 동작은 포인터처럼 동작 가능한 C++에서 추가된 변수 타입이다. 물론 이를 통하여 편리함을 얻게 되었지만, 문법을 잘 아는 것이 아니라면 call by value인지 call by reference인지 헷갈리는 경우가 있다. // 1_레퍼런스.cpp 41 page #include // 핵심 1. 기존 변수(메모리)에 새로운 이름을 부여 하는 것 // 2. 레퍼런스 변수 선언시 반드시 초기값이 있어야 합니다. int main() { int n1 = 10; int n2 = n1; int* p1 = &n1; int& r1 = n1; //..
C언어에서의 NULL 의 값은 0으로 고정되어 있다. C의 특성 상 포인터 값과 변수값 사이의 변환이 상대적으로 자유롭기 때문에 포인터가 아닌 변수값에 대해서도 NULL 값을 입력할 수 있고, 포인터 값에 대해서도 0을 입력할 수 있다. // 11_nullptr1.cpp 54 page int main() { // 0의 정체 : 0은 정수지만 포인터로 암시적 형변환된다. int n1 = 0; // ok int* p1 = 0; // ok // C++11. nullptr : 포인터 0 int n2 = nullptr; // error int* p2 = nullptr; // ok } C++에서는 포인터의 NULL값을 좀 더 strict 하게 지정할 수 있는 nullptr을 사용할 수 있다. 해당 값은 포인터에만 ..
C에서는 대부분의 캐스팅 연산을 사용자의 자유로 두고 있어 위험한 동작도 허용하는 경우가 많다. // 10_캐스팅1.cpp 48 page #include // C 캐스팅의 문제점 // 논리적으로 맞지 않고 위험한 경우도 대부분 성공한다. // 그래서 C++은 4개의 캐스팅 연산을 제공한다. int main() { int n = 3; // double* p = &n; // C언어 : 경고, C++ : 에러 double* p = (double*)&n; // C스타일 캐스팅 *p = 3.4; } #include // static_cast : 논리적으로 맞고 위험하지 않은 경우만 허용 // void*=> 다른 타입*, // 상속관계의 캐스팅 등. // 반드시 연관성이 있어야 한다 int main() { doub..
C언어를 사용하다보면 알게되지만, 제어문의 guard condition에 사용하는 변수는 필연적으로 해당 제어문의 scope가 아닌 제어문 바깥의 scope에 따른다. 최근의 C++17 표준에서는 제어문의 condition에 변수를 선언하여 제어문의 condition이 제어문의 안쪽에서만 사용할 수 있도록 제어문의 condition에 여러 명령을 실행할 수 있도록 하고 있다. 하지만, 가독성이 낮아질 수도 있으니, 상황에 따라 맞게 활용하여야 할 것 같다. // 9_제어문 #include // 39 page.. int foo() { return 0; } int main() { switch (int n = foo(); n ) { case 0: break; case 1: break; } // init con..
많은 고급 언어와 비슷한 문법을 C++에서도 지원한다. // 8_반복문 38 page #include int main() { int x[10] = { 1,2,3,4,5,6,7,8,9,10 }; // C++11 에서 등장한 새로운 반복문 for (auto n : x) // range - for // java, C#의 foreach() 문 std::cout
// 7_함수템플릿1.cpp #include //#include // cl /Tc 소스.cpp : C 언어 // cl /Tp 소스.cpp : C++ 언어 // 모든 타입에 동작하는 함수 만들기 - C언어 // 매크로 함수 //#define square(x) ((x)*(x)) // C++ : int 버전과 double 버전을 따로 만들자 // 방법 1. 사용자가 직접 만들자 // 방법 2. 함수 템플릿을 만들자. 컴파일러가 함수 생성 // Code Bloat : 템플릿 사용시 컴파일러가 너무 많은 함수(클래스) // 를 만들어서 목적코드가 커지는 현상 template T square(T a) { // __FUNCTION__ : 함수 이름을 담은 C++ 표준 매크로. // __FUNCSIG__ : 함수이름+..