목록c++ (35)
Brise
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__ : 함수이름+..
// C++함수의 특징 1. 디폴트 파라미터 // 주의 사항 1. 반드시 마지막 인자(오른쪽) 부터 차례대로 // 지정해야 한다. // 주의 사항 2. 함수를 선언과 구현으로 분리할 경우 // 선언부에만 표기한다. (28 page 아래) void foo(int a = 0, int b, int c = 0); // error void foo(int a = 0, int b = 0 , int c = 0); int main() { foo(1, 2, 3); // foo(1, 2); //foo(1); //foo(); } void foo(int a/* = 0*/, int b /*= 0*/, int c/* = 0 */) { } C++은 멀티 패러다임 언어이기 때문에 OOP 적인 특징을 구현하고 있다. 때문에 함수에 대하..
C++에서는 C언어의 const보다 좀 더 strict한 형태의 상수를 지원한다. const의 경우 상수이며 선언할 때 할당한 값 이후로 값을 부여 불가능하지만, constexpr은 컴파일 시 값이 정해져 있어야 한다는 특징을 가지고 있다. #include int main() { int arr1[10]; // ok int size = 10; int arr2[size]; // C89 : 배열의 크기는 컴파일 시간에 알아야 한다. // C99 : 배열의 크기로 변수도 가능 // g++(gcc)지원, VC++ 지원 안함 //sub esp, size const int size2 = 10; // 컴파일 시간 상수 int arr3[size2]; // ok const int size3 = size; // runtim..
// 4_변수1 #include // C++ 은 C언어의 변수 관련 문법을 더욱 발전시켰습니다. struct Point { int x, y; }; int main() { int n1 = 0b1; // 2진수 표기법, C++11 부터 지원 int n2 = 1'000'000; // digit separator, C++11부터 // 원리 : 정수형 리터럴 사이의 ' 는 // 컴파일러가 무시 struct Point p1; // C언어 스타일 Point p2; // C++언어 스타일. //foo() int n3; // 함수 중간에 변수 선언. // C89 : error // C99 : ok. // C++ : ok. } C와 C++ 문법 기준이 개선되며 변수 선언 위치 및 방법이 크게 개선되었..