main의 반환 값은 프로그램이 종료된 방식을 나타내는 데 사용됩니다. 프로그램 실행이 정상이면 0 반환 값을 사용합니다. 비정상적인 종료(오류, 잘못된 입력, 분할 오류 등)는 일반적으로 0이 아닌 반환으로 종료됩니다. 0이 아닌 코드를 해석하는 방법에 대한 표준은 없습니다. 자신의 상태 코드를 정의하고 이를 사용하여 프로그램에서 다양한 유형의 실패를 나타낼 수 있습니다. GCC는 종료 신호를 보내기 위해 stdlib.h에 정의된 EXIT_SUCCESS 또는 EXIT_FAILURE를 사용할 것을 권장합니다. C++에서 int ma
정의되지 않은 동작은 단순히 C++ 사양에서 정의되지 않은 동작입니다. 예를 들어, i++ + ++i와 같은 표현식에 단항 증가/감소 연산이 여러 개 있는 경우 정의되지 않은 동작이 발생합니다. 이것은 단순히 일부 언어 구성이 구문적으로 유효하지만 코드가 실행될 때 동작을 예측할 수 없다는 사실 때문입니다. 또 다른 예는 다음 표현식입니다. u =(u++); 구현 정의 동작은 사양에 의해 지정되지 않은 동작이며 구현자가 선택 방법을 결정하고 문서화하도록 남겨둡니다. 이 경우 그 선택은 보장되어야 합니다. 즉, 그렇게 되어야만 합니
C++에서는 분기 예측 때문에 정렬되지 않은 배열보다 정렬된 배열을 처리하는 것이 더 빠릅니다. 컴퓨터 아키텍처에서 분기 예측은 프로그램의 명령 흐름에서 조건 분기(점프)가 수행될 가능성이 있는지 여부를 결정합니다. 예를 들어 보겠습니다 - if(arr[i] > 50) { Do some operation B } else { Do some operation A } 100개의 요소에 대해 이 코드를 정렬되지 않고 정렬된 순서로 실행하면 다음과 같은 일이 발생합니다. - 정렬된 배열의
배열은 고유 식별자에 인덱스를 추가하여 개별적으로 참조할 수 있는 연속 메모리 위치에 배치된 동일한 유형의 요소 시리즈입니다. C++에서 배열을 사용하려면 먼저 선언해야 합니다(예:). int arr[10]; 이것은 크기가 10인 int 유형의 배열을 선언합니다. 이것은 연속 메모리에 10개의 정수를 저장할 수 있습니다. 해당 요소를 참조하려면 배열 액세스 연산자를 사용하고 액세스하려는 요소의 인덱스를 제공해야 합니다. C++ 배열의 인덱싱은 0부터 시작합니다. 따라서 배열 arr에는 인덱스 0, 1, 2, ... 9가 있는 10
참조 변수가 참조로 선언되면 기존 변수의 대체 이름이 됩니다. 구문 Type &newname = existing name; 초기화 Type &pointer; pointer = variable name; 포인터 포인터는 변수의 주소를 저장하는 데 사용됩니다. 구문 Type *pointer; 초기화 Type *pointer; pointer = variable name; 참조와 포인터의 주요 차이점은 - 참조는 다른 이름의 기존 변수를 참조하는 데 사용되는 반면 포인터는 변수의 주소를 저장하는 데 사용됩니다
복사 제거는 특정 상황에서 추가(잠재적으로 비용이 많이 드는) 사본을 방지하기 위해 대부분의 컴파일러에서 구현하는 최적화입니다. 따라서 사용되지 않거나 부작용이 없는 개체를 생성하는 코드가 있는 경우 예 struct MyStruct { MyStruct() {} MyStruct(const MyStruct&) { std::cout << "Copied.\n"; } }; MyStruct f() {
구조체의 sizeof와 해당 구조의 각 멤버의 sizeof 합계의 차이는 바이트 패딩 및 정렬로 인한 것입니다. C/C++의 모든 데이터 유형에는 정렬 요구 사항이 있습니다. 프로세서는 아키텍처의 처리 단어 길이를 갖습니다. 32비트 머신에서 처리 워드 크기는 4바이트 또는 32비트입니다. 예를 들어 struct −가 있는 경우 예시 #include <iostream> using namespace std; struct X { char b[3]; int c; }; int mai
배열과 포인터는 C/C++에서 매우 유사하게 작동합니다. 그러나 약간의 미묘한 차이가 있습니다. 예를 들어, sizeof 연산자는 둘에서 상당히 다르게 작동합니다. 포인터의 배열을 변환할 때 예시 #include<iostream> int main() { const int a[] = { 2, 3, 5, 7, 11 }; const int* p = a; std::cout << ( sizeof(p) != sizeof(a) ); } 출력 이것은 출력
정방향 선언은 선언 다음의 코드가 Person이라는 이름을 가진 클래스가 있음을 알 수 있도록 합니다. 이것은 사용된 이름을 볼 때 컴파일러를 만족시킵니다. 나중에 링커는 클래스의 정의를 찾습니다. 예 Class Person; void myFunc(Person p1) { // ... } Class Person { // Class definition here }; 따라서 이 경우 컴파일러가 myFunc를 만나면 코드 어딘가에서 이 클래스를 만날 것임을 알게 됩니다. 클래스를 사용하
스마트 포인터는 원시(또는 베어) C++ 포인터를 래핑하는 클래스입니다. 포인터가 가리키는 리소스를 관리하는 데 사용됩니다. 예를 들어, 해당 메모리 위치에 대한 참조가 손실된 경우입니다. 일종의 가비지 수집기 역할을 합니다. 여러 스마트 포인터 유형이 있습니다. 거의 항상 스마트 포인터를 사용해야 합니다. 포인터 사용의 주요 문제점은 수동 메모리 관리와 메모리 누수이기 때문입니다. 스마트 포인터는 이 두 가지를 모두 없애려고 합니다. 실제로 이러한 작업을 수행하지 않으려면 스마트 포인터를 사용해야 합니다.
현재 C 표준 문서는 ANSI 웹 스토어에서 찾을 수 있습니다. https://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2FISO%2FIEC+9899-2012 구매를 위한 ISO C++ 웹사이트에서 현재 C++ 표준 문서를 찾을 수 있습니다. - https://www.iso.org/standard/68564.html ISO C++ 표준 작업 초안은 https://isocpp.org/std/the-standard에서도 볼 수 있습니다.
const_cast 변수에 const를 제거하거나 추가하는 데 사용할 수 있습니다. 이것은 변수에서 constness를 추가/제거해야 하는 경우 유용할 수 있습니다. 정적 캐스트 일반/일반 유형 변환에 사용됩니다. 이것은 또한 암시적 형식 강제 변환을 담당하는 캐스트이며 명시적으로 호출할 수도 있습니다. float를 int로, char를 int로 변환하는 등의 경우에 사용해야 합니다. 다이내믹_캐스트 이 캐스트는 다형성을 처리하는 데 사용됩니다. 파생 클래스로 캐스팅할 때만 사용해야 합니다. 이것은 기본 클래스에서 파생 클래스로 형
싱글톤 디자인 패턴은 클래스의 인스턴스화를 하나의 개체로 제한하는 데 사용되는 소프트웨어 디자인 원칙입니다. 이는 시스템 전체에서 작업을 조정하는 데 정확히 하나의 개체가 필요한 경우에 유용합니다. 예를 들어 파일에 로그를 쓰는 로거를 사용하는 경우 싱글톤 클래스를 사용하여 이러한 로거를 만들 수 있습니다. 다음 코드를 사용하여 싱글톤 클래스를 만들 수 있습니다 - 예시 #include <iostream> using namespace std; class Singleton { static Sing
지역 변수가 범위를 벗어나면 액세스할 수 없습니다. 이것이 지역 변수라는 의미입니다. 하지만 범위 외부에서 로컬 변수의 메모리에 액세스할 수 있는 예를 살펴보겠습니다. 예시 #include<iostream> int* foo() { int x = 3; return &x; } int main() { int* address = foo(); cout << *address; *address = 12
수동 변수와 이중 변수를 비교하는 것은 최종 목표가 무엇인지에 따라 다릅니다. 너무 자세히 설명하지 않고 실행 가능한 기능을 원하고 일부 부정확한 계산에 문제가 없다면 다음 기능을 사용할 수 있습니다 - 예시 #include<iostream> using namespace std; // Define the error that you can tolerate #define EPSILON 0.000001 bool areSame(double a, double b) { return fabs(a - b) &
C, C++, Python 및 이러한 작업을 지원하는 기타 모든 프로그래밍 언어에서 비트 연산자를 사용하여 지우기 및 토글 비트를 설정할 수 있습니다. 또한 비트를 올바른 위치로 가져오려면 비트 시프트 연산자를 사용해야 합니다. 약간 설정 비트를 설정하려면 비트 OR 연산자 −를 사용해야 합니다. 예시 #include n; 나는 |=(1 <
직접 파일을 읽으면 놓칠 수 있는 경우가 많기 때문에 C++에서 CSV 파일을 구문 분석하려면 라이브러리를 사용해야 합니다. C++용 부스트 라이브러리는 CSV 파일을 읽기 위한 정말 좋은 도구 세트를 제공합니다. 예를 들어, 예시 #include<iostream> vector<string> parseCSVLine(string line){ using namespace boost; std::vector<std::string> vec; &nb
첫 번째 방법은 stringstream을 사용하여 공백으로 구분된 단어를 읽는 것입니다. 이것은 약간 제한적이지만 적절한 검사를 제공하면 작업을 상당히 잘 수행합니다. 예 #include <vector> #include <string> #include <sstream> using namespace std; int main() { string str("Hello from the dark side"); string tmp; // A s
위의 기호는 다음을 의미합니다. - int* - Pointer to int. This one is pretty obvious. int const * - Pointer to const int. int * const - Const pointer to int int const * const - Const pointer to const int 또한 − const int * And int const * are the same. const int * const And int const * const are the same. 그러한 기호를
Effective C++의 Scott Meyers는 다음과 같이 말합니다. 클래스에 가상 기능이 있는 경우 가상 소멸자가 있어야 하며 기본 클래스로 설계되지 않았거나 다형성으로 사용하도록 설계되지 않은 클래스는 가상 소멸자를 선언해서는 안 됩니다. 따라서 다형성 기본 클래스에서 소멸자를 가상으로 선언해야 합니다. 파생 생성자를 사용하여 기본 클래스의 개체를 생성하는 경우 - Base *b = new Derived(); // use b delete b; Base의 소멸자가 가상이 아닌 경우 이 경우 delete b는 정의되지