두 형식의 차이점은 전처리기가 포함될 파일을 검색하는 위치에 있습니다. #include 전처리기는 구현에 따라 검색하고 컴파일러에서 미리 지정한 디렉토리를 검색합니다. 이 방법은 일반적으로 표준 라이브러리 헤더 파일을 포함하는 데 사용됩니다. #include 파일 이름 전처리기는 지시문이 포함된 파일과 동일한 디렉토리에서 검색합니다. 이것이 실패하면 #include 형식처럼 작동하기 시작합니다. 이 방법은 일반적으로 자신의 헤더 파일을 포함하는 데 사용됩니다.
동적 2D 배열은 기본적으로 배열에 대한 포인터 배열입니다. 따라서 먼저 포인터에 대한 포인터 배열을 초기화한 다음 루프의 각 1d 배열을 초기화해야 합니다. 예 #include<iostream> using namespace std; int main() { int rows = 3, cols = 4; int** arr = new int*[rows]; for(int i = 0; i < rows; ++i) arr[i] = new
일반적으로 사용 가능한 공간이 거의 없는 스택에 잠재적으로 큰 배열을 생성해야 하는 것은 좋지 않습니다. 크기를 미리 알면 정적 배열을 사용할 수 있습니다. 그리고 미리 크기를 모르면 안전하지 않은 코드를 작성하게 됩니다. 가변 길이 배열은 유형 시스템에서 큰 변화가 필요하기 때문에 C++에 기본적으로 포함될 수 없습니다. C++의 가변 길이 배열에 대한 대안은 벡터인 C++ STL에서 제공됩니다. 다음과 같이 사용할 수 있습니다 - 예시 #include<iostream> #include<vector> usin
3의 법칙은 C++를 사용할 때의 경험 법칙입니다. 이것은 수업에 다음 중 하나가 필요한 경우 복사 생성자, 할당 연산자, 또는 소멸자, 명시적으로 정의된 경우 이 세 가지가 모두 필요할 수 있습니다. 왜 이런거야? 클래스에 위의 항목 중 하나가 필요한 경우 동적으로 할당된 리소스를 관리하고 있고 이를 성공적으로 달성하기 위해 다른 리소스가 필요할 수 있기 때문입니다. 예를 들어 할당 연산자가 필요한 경우 현재 참조로 복사되고 있는 개체의 복사본을 만들어 리소스를 할당하게 됩니다. 복사를 위한 복사 생성자와 이러한 리소스를
5의 규칙은 리소스 관리를 위해 C++에 적용됩니다. 리소스 관리는 클라이언트가 관리 대상 개체의 수명에 대해 걱정할 필요가 없도록 하여 잠재적으로 C++ 코드의 메모리 누수 및 기타 문제를 제거합니다. 그러나 이러한 관리에는 대가가 따릅니다. Big Five의 규칙에 따르면 다음 기능 중 하나를 작성해야 하는 경우 모든 기능에 대한 정책이 있어야 합니다. 객체 Foo가 있으면 리소스 Foo를 처리하는 FooManager를 가질 수 있습니다. FooManager를 구현할 때 다음 기능을 구현해야 할 것입니다. - 소멸자 − 이
C++98 C++ 표준의 초판이었습니다. 모든 기본 언어 구성, STL 및 표준 라이브러리를 정의했습니다. C++03 이 표준의 다음 개정판이었습니다. 이것은 92개의 핵심 언어 결함 보고서, 125개의 라이브러리 결함 보고서를 수정하고 하나의 새로운 언어 기능인 값 초기화만 포함했기 때문에 표준에 대한 버그 수정으로 주로 간주되었습니다. C++0x 2008-09년까지 완료될 예정이었으나 2011년에 마침내 완료된 진행 중인 작업의 이름입니다. C++11 2011년에 발표된 최신 C++ 표준이었습니다. 이는 기존 언어에 많은 주
간단히 말하면, new 배치를 사용하면 주어진 변수에 이미 할당된 메모리에 개체를 구성할 수 있습니다. 이는 이미 할당된 동일한 메모리를 재할당하지 않고 재사용하는 것이 더 빠르기 때문에 최적화에 유용합니다. 다음과 같이 사용할 수 있습니다 - new (address) (type) initializer 주어진 유형의 새 객체가 생성되기를 원하는 주소를 지정할 수 있습니다. 예시 #include<iostream> using namespace std; int main() { int a = 5; &nb
C++ 및 C 표준은 일반적으로 출판된 연도의 이름을 따서 명명됩니다. 예를 들어 C++의 경우 원래 표준이 1998년에 출판되었으므로 C++98이라고 합니다. , 그리고 2003년에 발표된 첫 번째 수정을 C++03이라고 합니다. 다음 개정판에서는 다음 표준이 2008년까지 완료될 예정이었으나 불확실하여 C++0x로 명명되었으며 x는 8 또는 9를 나타냅니다. 계획이 바뀌었지만 지금은 C++11이라고 합니다. 따라서 C++0x는 게시되기 전에 표준의 이름이었습니다. 2011년에 완료되면 C++11로 이름이 지정되었습니다.
GNU C++ 컴파일러인 g++는 C++ 언어에 대한 확장을 제공합니다. 두 옵션의 차이점은 C++ 표준을 위반할 수 있는 이러한 GNU 확장이 활성화되었는지 여부입니다. 일부 확장은 표준을 위반하지 않는 경우 -std =c++11을 사용할 때 여전히 유효할 수 있습니다. GNU 컴파일러의 C++ 언어 확장 목록은 여기에서 찾을 수 있습니다. https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html
GCC는 공개된 여러 ISO 표준에 따라 다양한 C++ 방언을 지원합니다. 구현하는 표준은 -std=명령줄 옵션을 사용하여 선택할 수 있습니다. C++98 − GCC는 2003년에 수정되고 C++03으로 이름이 변경된 1998 C++ 표준과 이후의 일부 결함 보고서를 완벽하게 지원합니다. C++11 − GCC 4.8.1은 이전에 C++0x로 알려졌던 2011 C++ 표준의 첫 번째 완전한 구현이었습니다. C++14 − GCC는 2014년에 발표된 C++ 표준의 최신 개정판을 완벽하게 지원합니다. C++17 − GCC는 2017년
C++11은 2011년에 발표된 최신 C++ 표준입니다. 이로 인해 기존 언어에 많은 주요 확장과 개선이 이루어졌습니다. 다음은 C++11의 주요 변경 사항/추가 사항입니다 - 초기화 목록 자동 유형 추론 Rvalue 참조 및 이동 생성자 constexpr – 일반화된 상수 표현식 일반 오래된 데이터의 정의 수정 균일한 초기화 범위 기반 for 루프 람다 함수 및 표현식 대체 함수 구문 명시적 재정의 및 최종 상수 널 포인터, nullptr 강력한 형식의 열거형 적절한 위치에서 연산자로 취급되지 않는 오른쪽 꺾쇠 괄호 가변 템플릿
C++11은 2011년에 발표된 최신 C++ 표준입니다. 이로 인해 기존 언어에 많은 주요 확장과 개선이 이루어졌습니다. 2011년 8월 12일 ISO(국제 표준화 기구)의 승인을 받았으며 C++03을 대체했습니다. C++11은 C++0x라고도 합니다. 차기 개정판에서는 2008년까지 차기 표준이 완성될 예정이었으나 불확실하여 C++0x라는 이름을 붙였기 때문이다. 여기서 x는 8이나 9를 의미한다. 계획이 바뀌긴 했지만 이제 C++11이라고 합니다. 따라서 C++0x는 게시되기 전에 표준의 이름이었습니다. 2011년에 완료되면 C
POD는 일반 오래된 데이터를 의미하는 C++의 약어입니다. 멤버 변수만 있고 메서드, 생성자, 소멸자, 가상 함수 등이 없는 클래스/구조체입니다. 예를 들어 예시 #include<iostream> using namespace std; // POD struct MyStruct { int key; string data; }; int main() { struct MyStruct s; s.key = 1;
C++ STL에는 std::for_each와 같은 유용한 일반 함수가 포함되어 있습니다. 불행히도, 특히 적용하려는 펑터가 특정 기능에 고유한 경우 사용하기가 상당히 복잡할 수 있습니다. 따라서 생성할 이 함수는 해당 네임스페이스에서 한 곳에서 사용되는 것입니다. 이에 대한 해결책은 익명 함수를 사용하는 것입니다. C++는 익명 함수 생성을 허용하기 위해 C++11에 람다 표현식을 도입했습니다. 예시 #include<iostream> #include<vector> #include <algorithm>
POD는 일반 오래된 데이터를 의미하는 C++의 약어입니다. 멤버 변수만 있고 메서드, 생성자, 소멸자, 가상 함수 등이 없는 클래스/구조체입니다. 예를 들어 예시 #include<iostream> using namespace std; // POD struct MyStruct { int key; string data; }; int main() { struct MyStruct s; s.key = 1; s.d
C++ 표준은 정수 유형의 크기를 바이트 단위로 지정하지 않습니다. 이러한 유형이 보유할 수 있어야 하는 최소 범위를 지정합니다. 비트 단위의 크기는 지정된 최소 범위에서 쉽게 찾을 수 있습니다. 표준을 말하는 것이 아니라 다양한 플랫폼에서 일반적으로 사용되는 크기는 다음과 같습니다. - 32비트 시스템의 경우 표준은 ILP32입니다. 즉, int, long 및 포인터는 모두 32비트 수량입니다. 64비트 시스템의 경우 Unix 표준은 LP64입니다. long 및 포인터는 64비트입니다(그러나 int는 32비트임). Window
이는 C++에서 경계 검사를 수행하지 않기 때문입니다. Java 및 python과 같은 언어에는 경계 검사가 있으므로 경계를 벗어난 요소에 액세스하려고 하면 오류가 발생합니다. C++ 디자인 원칙은 동등한 C 코드보다 느리지 않아야 하며 C는 배열 경계 검사를 수행하지 않는다는 것입니다. 따라서 이 메모리에 액세스하려고 하면 C++ 표준으로 작성되었으므로 프로그램 동작이 정의되지 않습니다. 일반적으로 정의되지 않은 동작이 발생할 때마다 모든 일이 발생할 수 있습니다. 응용 프로그램이 충돌하거나 정지할 수 있으며 정상적으로 실행되거나
객체를 함수에 전달하는 네 가지 방법이 있습니다. X 클래스가 있고 fun 함수에 전달하려고 한다고 가정해 보겠습니다. 그러면 - 값으로 전달 이렇게 하면 함수 범위에서 개체의 얕은 로컬 복사본이 생성됩니다. 여기에서 수정한 사항은 전달된 객체에 반영되지 않습니다. 예를 들어, 선언 void fun(X x); 전화 걸기 X x; fun(x); 참조로 전달 이것은 객체에 대한 참조를 함수에 전달합니다. 여기에서 수정한 사항은 전달된 객체에 반영됩니다. 개체의 복사본이 생성되지 않습니다. 예를 들어, 선언 voi
유일한 안전한 방법은 오버플로가 발생하기 전에 확인하는 것입니다. 그러나 정수 오버플로를 확인하는 몇 가지 해킹 방법이 있습니다. 따라서 unsigned int 추가에서 오버플로를 감지하는 것을 목표로 하는 경우 결과가 실제로 추가된 값보다 작은지 확인할 수 있습니다. 예를 들어 unsigned int x, y; unsigned int value = x + y; bool overflow = value < x; // Alternatively "value < y" should also work 이는 x와
쉼표 연산자의 목적은 여러 표현식을 결합하는 것입니다. 쉼표로 구분된 표현식 목록의 값은 맨 오른쪽 표현식의 값입니다. 쉼표의 효과는 일련의 작업을 수행할 수 있도록 하는 것입니다. 다른 표현식의 값은 무시됩니다. 즉, 오른쪽의 표현식이 쉼표로 구분된 전체 표현식의 값이 됩니다. 예시 다음 프로그램은 쉼표 연산자의 작업을 보여줍니다 - #include <iostream> using namespace std; int main() { int i, j; j = 10;