개인 재정 C ++으로 프로그래밍 시작하기 Dummies 치트 시트 - 인형

C ++으로 프로그래밍 시작하기 Dummies 치트 시트 - 인형

비디오: Data Structures: Crash Course Computer Science #14 2024

비디오: Data Structures: Crash Course Computer Science #14 2024
Anonim

By Stephen R Davis

C ++은 쉬운 프로그래밍 언어가 아닙니다. 경험을 통해서만 무수한 기호 조합이 자연스럽게 보일 것입니다. 그러나이 치트 시트는 C ++ 초보자에서 C ++ 전문가로 쉽게 전환 할 수있는 몇 가지 확실한 팁을 제공합니다. 복잡한 C ++ 표현식을 읽는 방법을 알고 있어야합니다. 포인터 문제를 피하는 방법을 배웁니다. 어떻게 그리고 언제 깊은 사본을 만들 수 있는지 파악하십시오.

C ++은 표현의 의미를 더하는 작은 기호로 가득 차 있습니다. C ++ 문법 규칙은 매우 유연하여 이러한 기호를 거의 불가능한 복잡한 조합으로 결합 할 수 있습니다. 간단한 C 언어로 된 표현은 너무 모호해 져서 가장 모호한 프로그램을 작성할 수 있고 누가 이해할 수 있는지에 대한 연례 콘테스트가있었습니다.

가장 많이 삽입 된 괄호에서 시작하십시오.

가장 바깥 쪽 괄호를 찾습니다. 그 안에 괄호가 있는지 확인하십시오. 가장 깊은 쌍의 괄호로 갈 때까지이 과정을 반복하십시오. 먼저 다음 규칙을 사용하여 서브 표현식을 평가하기 시작하십시오. 표현을 이해하면 다음 단계로 다시 돌아와서 과정을 반복하십시오.

  1. 괄호 쌍 내에서 우선 순위에 따라 각 연산을 평가합니다.

    운영자가 평가되는 순서는 표에 표시된 운영자의 우선 순위에 따라 결정됩니다. 간접 참조는 덧셈 전에 오는 곱하기 전에옵니다. 따라서 다음은 * ptr이 가리키는 값의 1과 2를 더합니다. int i = 1 + 2 * * ptr;
  2. 연산자 우선 순위

    우선 순위

연산자
의미

1 () (단항) 함수 호출
2 * 및 -> (단항) 포인터를 비표준
2 - (단항) 인수의 음수를 반환
3 ++ (단항) 증가
3 (2 진) 4 4 4 4 4 4 논리 곱 AND (이진수) 논리 곱 AND (이진수) 논리 곱 AND (이진수) 논리 AND 6
! ! 할당 유형 동일한 우선 순위의 작업을 왼쪽에서 오른쪽으로 평가합니다 (할당, 할당 및 할당을 제외하고는 논리 OR
7 =, * =, % =, + =, - = 그것은 다른 방향으로 간다). 같은 우선 순위의 연산자는 왼쪽에서 오른쪽으로 계산됩니다. 따라서 다음은 1을 2로 더하고 그 결과를 3에 더합니다.
int i = 1 + 2 + 3; 일부 운영자의 평가 순서는 중요하지 않습니다. 예를 들어 오른쪽에서 왼쪽으로와 마찬가지로 왼쪽에서 오른쪽으로 추가가 동일하게 작동합니다. 평가 순서는 부서와 같은 일부 작업에 많은 차이가 있습니다. 다음은 8을 4로 나누고 결과를 2로 나눕니다. int i = 8 / 4 / 2;
이 규칙의 주요 예외는 오른쪽에서 왼쪽으로 평가되는 할당입니다. a = b = c; 이것은 c에 b를 지정하고 a에 결과를 지정합니다.
특정 순서없이 하위 표현식을 평가합니다. 다음 표현식을 고려하자. int i = f () + g () * h (); 곱셈의 우선 순위가 더 높으므로 f ()보다 먼저 g () 및 h () 함수가 호출된다고 가정 할 수도 있지만 그렇지 않습니다. 함수 호출은 모두의 우선 순위가 가장 높으므로 곱하기 또는 더하기가 수행되기 전에 세 함수가 모두 호출됩니다. (g () 및 h ()에서 반환 된 결과는 곱 해져서 f ()에서 반환 된 결과에 추가됩니다.)
함수 순서가 호출되는 유일한 시간은 함수에 부작용이있는 경우입니다 예를 들어 파일을 열거 나 전역 변수의 값을 변경하는 경우. 이러한 유형의 부작용에 의존하도록 프로그램을 작성해서는 안됩니다. 필요한 경우에만 유형 변환을 수행하십시오. 절대적으로 필요한 것보다 더 많은 유형 변환을해서는 안됩니다. 예를 들어, 다음 표현식은 적어도 세 가지 및 네 가지 유형 변환이 있습니다.
float f = 'a'+ 1; char 'a'는 추가를 수행하기 위해 int로 승격되어야합니다. 그런 다음 int는 double로 변환 된 다음 단 정밀도 float로 아래로 변환됩니다. 모든 산술 연산은 int 또는 double 형식으로 수행됩니다. 일반적으로 문자 유형에 대해 산술 연산을 수행하지 말고 단 정밀도 부동을 사용하지 않아야합니다. C ++에서 포인터 문제를 피하는 5 가지 방법
C ++에서 포인터 는 컴퓨터의 내부 메모리에있는 개체의 주소를 포함하는 변수입니다. C ++에서 포인터 관련 문제를 방지하려면 다음 단계를 사용하십시오.
선언시 포인터 초기화. 포인터 변수를 초기화하지 않은 상태로 두지 마십시오. 초기화되지 않은 포인터에 항상 임의의 값이 포함되어 있으면 상황이 너무 나빠질 수 있습니다. 대부분의 임의 값은 잘못된 포인터 값이며 프로그램을 사용하자마자 충돌을 일으킬 수 있습니다. 문제는 초기화되지 않은 변수는 이전에 사용 된 다른 포인터 변수의 값을 사용하는 경향이 있다는 것입니다. 이러한 문제는 디버그하기가 매우 어렵습니다. 포인터를 초기화 할 다른 것을 모른다면 nullptr로 초기화하십시오. nullptr은 잘못된 주소가 될 수 있습니다.
  1. 사용 후 포인터를 제로화하십시오.

    마찬가지로 포인터가 더 이상 유효하지 않으면 포인터 변수에 항상 nullptr 값을 할당하여 포인터 변수를 0으로 만듭니다. 이것은 delete를 사용하여 힙에 메모리 블록을 반환 할 때 특히 그렇습니다. 항상 힙 메모리를 반환 한 후 포인터를 0으로 만듭니다.

    메모리 누출을 피하기 위해 힙의 메모리를 할당하고 같은 "수준"의 힙으로 되돌립니다.
    

    항상 메모리 블록을 할당 한 것과 같은 수준의 추상화로 메모리 블록을 힙으로 반환하려고합니다. 이것은 일반적으로 동일한 수준의 함수 호출에서 메모리를 삭제하려고 시도하는 것을 의미합니다.

    필요한 경우 메모리를 삭제하는 예외를 잡으십시오.
    

    예외는 거의 언제든지 발생할 수 있음을 잊지 마십시오. 예외를 잡아서 (프로그램이 충돌하는 것과는 반대로) 계속 예외를 잡으려고한다면 예외를 잡아서 메모리 블록을 가리키는 포인터가 범위를 벗어나기 전에 메모리 블록을 힙으로 반환하고 메모리가 잃어버린.

    유형이 정확히 일치하는지 확인하십시오.
    

    포인터 유형이 필수 유형과 항상 일치하는지 항상 확인하십시오. 특별한 이유없이 포인터를 다시 작성하지 마십시오. 다음을 고려하십시오:

  2. void fn (int * p); void myFunc () {char c = 'a'; char * pC = & c; fn (int *) pC);}

    위의 함수는 문자 포인터 pC가 fn (int *)의 선언과 일치하도록 int *로 다시 작성되었으므로 불만없이 컴파일됩니다. 그러나이 프로그램은 거의 확실하게 작동하지 않을 것입니다. 함수 fn ()은 전체 32 비트 정수에 대한 포인터를 기대하며 링킹하지 않은 8 비트 char이 아닙니다. 이러한 유형의 문제는 분류하기가 매우 어렵습니다.

    C ++로 깊은 복사를하는 방법과시기
    

    생성자에서 자원을 할당하는 클래스에는 일반적으로 이러한 자원의 복사본을 생성하는 복사 생성자가 포함되어야합니다. 새로운 메모리 블록을 할당하고 원본 내용을이 새 블록에 복사하는 것을 기본 복사본 인

    (999) (기본 복사본과 반대) 만들기. C ++에서 딥 복사본을 만드는 방법과시기를 결정하려면 다음 단계를 사용하십시오.

  3. 생성자가 리소스를 할당하는 경우 항상 딥 복사본을 만듭니다.

    기본적으로 C ++은 함수에 전달할 때 또는 할당의 결과로 객체의 사본을 소위 "얕은"구성원으로 만듭니다. 생성자에서 리소스를 할당하는 모든 클래스에 대해 기본 얕은 복사 연산자를 해당 전체 복사본으로 대체해야합니다. 할당되는 가장 일반적인 리소스는 new 연산자에 의해 반환되는 힙 메모리입니다.

    리소스를 할당하는 클래스에 항상 소멸자를 포함시킵니다.
    

    리소스를 할당하는 생성자를 만드는 경우이를 복원하는 소멸자를 만들어야합니다. 예외 없음.

소멸자를 항상 선언하십시오.

일반적인 초급 오류는 소멸자를 가상으로 선언하는 것을 잊어 버리는 것입니다. 프로그램은 의심하지 않는 프로그래머가 따라 와서 클래스에서 상속받을 때까지 잘 돌아갑니다. 프로그램은 여전히 ​​작동하는 것처럼 보이지만 기본 클래스의 소멸자가 제대로 호출되지 않을 수 있으므로 결국 프로그램이 체로 나올 때까지 메모리 누수가 발생합니다. 이 문제는 찾기가 어렵습니다. 리소스를 할당하는 클래스의 복사본 생성자를 항상 포함하십시오. 복사 생성자는 힙의 메모리를 할당하고 소스 객체의 내용을 복사하여 현재 객체의 적절한 복사본을 만듭니다.

  1. 자원을 할당하는 클래스의 대입 연산자를 항상 무시합니다.

    프로그래머는 연산자를 무시하지 말아야하지만 할당 연산자는 예외입니다. 생성자에서 리소스를 할당하는 모든 클래스에 대한 대입 연산자를 재정의해야합니다.

    대입 연산자는 세 가지 작업을 수행해야합니다.

  2. 왼쪽 및 오른쪽 손 객체가 같은 객체가 아닌지 확인합니다. 즉, 응용 프로그램 프로그래머가 (a = a)와 같은 것을 쓰지 않았는지 확인하십시오. 그들이 있다면, 아무것도하지 마십시오.

    왼손 객체의 소멸자와 동일한 코드를 호출하여 리소스를 반환합니다.

  3. 복사 생성자와 동일한 코드를 호출하여 오른손 오브젝트의 딥 카피를 왼손 오브젝트에 만듭니다.

    그렇게 할 수 없다면 복사 생성자와 대입 연산자를 삭제하여 프로그램이 객체의 복사본을 만들 수 없게하십시오.

  4. 컴파일러가 C ++ 2011 삭제 생성자 기능을 지원하지 않기 때문에 그렇게 할 수 없다면 빈 복사 생성자 및 할당 연산자를 만들고 다른 클래스가이를 사용하지 못하도록 보호한다고 선언하십시오.

C ++으로 프로그래밍 시작하기 Dummies 치트 시트 - 인형

편집자의 선택

Dragon Go! iPhone 및 iPad 용 앱 - 인형

Dragon Go! iPhone 및 iPad 용 앱 - 인형

Dragon Search를 사용하시는 분이라면 Dragon Go를 사용하는 것이 좋습니다! Nuance는 iPhone 3GS, iPhone 5, iPhone 4, iPod touch (3 세대), iPod touch (4 세대) 및 iPad에서 사용할 수 있도록 무료로 다운로드 할 수있는이 앱을 만들었습니다. (iOS 4.0 이상이어야합니다.) Android 기기에서도 사용할 수 있습니다. 드래곤가! ...

드래곤에서 피할 수있는 10 가지 실수 말하기 - 인형

드래곤에서 피할 수있는 10 가지 실수 말하기 - 인형

모두가 실수를 저지르고 어떤 사람들은 정말 크고 재미있게 만든다. 실수. NaturallySpeaking을 사용하여 많은 실수를 저 지르므로 때때로 수시로 일부를 만들 수도 있습니다. 내가 묻는 것은 다음과 같습니다. 내가 미리 짐작했던 10 가지 분명한 실수를하지 마십시오. 원래의 수. 창조적으로 행동하십시오. 거기서 나가서 ...

NaturallySpeaking을위한 10 가지 시간 절약 팁 - 인형

NaturallySpeaking을위한 10 가지 시간 절약 팁 - 인형

때로는 잘하고 그냥 사용하는 것의 차이 새로운 소프트웨어는 더 지혜롭고 경험 많은 스승의 충고 한 부분입니다. 누군가가 당신에게 전에 말했었 으면 좋을 10 가지가 있습니다. 대화 상자의 단축키 사용 대화 상자, 라디오 버튼, 확인란의 다양한 기능 ...

편집자의 선택

Google SketchUp 8에서 새로운 지형 모델을 만드는 법 - Google에서 모델링 할 때 인형

Google SketchUp 8에서 새로운 지형 모델을 만드는 법 - Google에서 모델링 할 때 인형

SketchUp을 사용하면 지형을 만들어야 할 수 있습니다. 건물에 대한 패치를 모델링하든 센트럴 파크를 다시 디자인하든 기존 데이터로 지형을 모델링 할 수 있습니다. 기존 데이터는 일반적으로 등고선 또는 토폴 라인 형태로 도착합니다. 지형지도에서 볼 수있는 삐걱 거리는 선을 알고 있습니다.

SketchUp에서 드레이프로 경로와 도로를 만드는 법 - 스케치 업에서 드레이프 도구

SketchUp에서 드레이프로 경로와 도로를 만드는 법 - 스케치 업에서 드레이프 도구

드레이프 도구가 작동 함 쿠키 커터와 조금 같다. 그것을 사용하여 객체의 가장자리를 직접 그 아래에있는 다른 표면으로 전송합니다. 아마도 당신은 부드럽게 경 사진 지형을 가지고 있으며, 당신은 그것에 사행 경로를 그리기를 원할 것입니다. 경로는 윤곽선을 따라야합니다.

SketchUp 모델을 3D 인쇄 용 부품으로 자르는 방법 - 인형

SketchUp 모델을 3D 인쇄 용 부품으로 자르는 방법 - 인형

SketchUp 모델 자르기 Intersect Faces 도구를 사용하여 그룹을 결합하는 것과 매우 유사합니다. 더 큰 오브젝트와 교차하여 커팅의 새 가장자리가 될 커터로 지오메트리를 사용할 것입니다. 모델이 매우 단순하고 SketchUp을 사용하는 경우 ...

편집자의 선택

Route Prefix를 사용하여 Junos - dummy에서 라우팅 필터를 생성하는 방법

Route Prefix를 사용하여 Junos - dummy에서 라우팅 필터를 생성하는 방법

라우팅 정책은 특정 경로가 라우팅 테이블에 수용되거나 일부 인접 라우터에 보급되는 것을 방지하기위한 것입니다. 경우에 따라 특정 경로 또는 경로 집합을 일치시키는 것이 유용 할 수 있습니다. 이렇게하려면 경로 필터를 사용합니다. 경로 필터는 특정 IP 주소 또는 접두어 범위에서 일치합니다. ...

Junos 라우터에서 COS의 코드 포인트 별명을 사용하는 방법 - 인형

Junos 라우터에서 COS의 코드 포인트 별명을 사용하는 방법 - 인형

전달 수업은 고통 스러울 수 있습니다. 더 좋은 방법은 코드 포인트 별칭을 사용하는 것입니다. CoS (Class of Service) 정책을 결정할 때 비트 패턴을 지정하는 대신 비트 패턴을 나타내는 별칭 이름을 정의 할 수 있습니다. 이러한 별칭을 코드 포인트 별칭이라고합니다. 간단히 말하자면 코드 포인트를 사용하십시오 ...

Junos 라우팅 정보를 요약하는 방법 - 더미

Junos 라우팅 정보를 요약하는 방법 - 더미

때때로 라우팅 정보를 간단하게 요약 할 수 있습니다 라우터. 예를 들어, 네트워크에서 OSPF를 방금 구성 했으므로 라우팅 테이블에 특정 수의 OSPF 경로가 표시 될 것으로 예상됩니다. show route summary 명령을 실행하여 모든 경로를 볼 수 있습니다 ...