C ++의 숨겨진 기능? [닫은]

질문의 “숨겨진 기능”과 관련하여 C ++를 좋아하지 않습니까? 나는 그것을 밖으로 버릴 것이라고 생각했다. C ++의 숨겨진 기능은 무엇입니까?



답변

대부분의 C ++ 프로그래머는 삼항 연산자에 익숙합니다.

x = (y < 0) ? 10 : 20;

그러나 그들은 그것이 lvalue로 사용될 수 있다는 것을 깨닫지 못합니다.

(a == 0 ? a : b) = 1;

약어입니다

if (a == 0)
    a = 1;
else
    b = 1;

주의해서 사용하십시오 🙂


답변

오류없이 URI를 C ++ 소스에 넣을 수 있습니다. 예를 들면 :

void foo() {
    http://stackoverflow.com/
    int bar = 4;

    ...
}


답변

포인터 산술.

C ++ 프로그래머는 발생할 수있는 버그 때문에 포인터를 피하는 것을 선호합니다.

내가 본 것 중 가장 멋진 C ++? 아날로그 리터럴.


답변

대부분의 게시물에 동의합니다. C ++는 다중 패러다임 언어이므로 찾을 수있는 “숨겨진”기능 (모든 대가를 치르는 “정의되지 않은 동작”제외)은 시설의 현명한 사용입니다.

이러한 기능의 대부분은 언어의 내장 기능이 아니라 라이브러리 기반 기능입니다.

가장 중요한 것은 RAII 인데, C 세계에서 온 C ++ 개발자들이 수년 동안 무시하는 경우가 많습니다. 연산자 오버로딩 은 종종 배열과 같은 동작 (아래 첨자 연산자), 포인터와 같은 작업 (스마트 포인터) 및 내장형 작업 (행렬 곱하기)을 모두 가능하게하는 오해 된 기능입니다.

예외 의 사용 은 종종 어렵지만 일부 작업을 수행하면 예외 안전 사양 (실패하지 않는 코드 또는 성공할 커밋과 유사한 기능을 포함하는 코드 포함)을 통해 정말 강력한 코드를 생성 할 수 있습니다. 원래 상태).

C ++의 가장 유명한 “숨겨진”기능은 템플릿 메타 프로그래밍 입니다. 이는 런타임 대신 컴파일 시간에 프로그램을 부분적으로 (또는 전체적으로) 실행할 수있게 해주기 때문입니다. 그러나 이것은 어렵고 템플릿을 시도하기 전에 확실한 이해가 있어야합니다.

다른 사람들은 C ++의 조상, 즉 C 외부에서 “프로그래밍 방법”을 생성하기 위해 다중 패러다임을 사용합니다.

functors 를 사용 하면 추가 유형 안전성 및 상태 저장 기능 을 사용하여 함수를 시뮬레이션 할 수 있습니다. 명령 패턴을 사용하여 코드 실행을 지연 할 수 있습니다. 대부분의 다른 디자인 패턴 은 “공식 C ++ 패러다임”목록에 포함되지 않아야하는 대체 코딩 스타일을 생성하기 위해 C ++로 쉽고 효율적으로 구현할 수 있습니다.

템플릿 을 사용 하면 처음에 생각했던 유형을 포함하여 대부분의 유형에서 작동하는 코드를 생성 할 수 있습니다. 유형 안전성도 높일 수 있습니다 (자동화 된 typesafe malloc / realloc / free처럼). C ++ 객체 기능은 정말 강력하지만 (따라서 부주의하게 사용하면 위험합니다) 동적 다형성 도 C ++에서 정적 버전 인 CRTP를 갖습니다 .

나는 Scott Meyers의 대부분의 ” Effective C ++ “유형의 책이나 Herb Sutter의 ” Exceptional C ++ “유형의 책은 읽기 쉽고 C ++의 알려진 기능과 덜 알려진 기능에 대한 정보의 귀중함을 발견했습니다.

내가 선호하는 것 중 하나는 자바 프로그래머의 머리를 공포에서 벗어나게 만드는 것입니다. C ++에서 객체에 기능을 추가하는 가장 객체 지향적 인 방법은 멤버가 아닌 멤버가 아닌 친구 함수를 사용하는 것입니다. 함수 (즉, 클래스 메서드)는 다음과 같은 이유 때문입니다.

  • C ++에서 클래스의 인터페이스는 동일한 네임 스페이스의 멤버 함수이자 비 멤버 함수입니다.

  • 친구가 아닌 비회원 함수는 내부 클래스에 대한 권한있는 액세스 권한이 없습니다. 따라서 멤버가 아닌 친구보다 멤버 함수를 사용하면 클래스의 캡슐화가 약화됩니다.

이것은 경험 많은 개발자조차도 놀라지 않습니다.

(출처 : Herb Sutter의 온라인 Guru of the Week # 84 : http://www.gotw.ca/gotw/084.htm )


답변

학교에서 내내 들어 본 적이 없었기 때문에 다소 숨겨져 있다고 생각하는 언어 기능 중 하나는 네임 스페이스 별칭입니다. 부스트 문서에서 예제를 볼 때까지 내 관심을 끌지 못했습니다. 물론, 이제는 표준 C ++ 참조에서 찾을 수 있습니다.

namespace fs = boost::filesystem;

fs::path myPath( strPath, fs::native );


답변

for루프 의 init 부분에서 변수를 선언 할 수있을 뿐만 아니라 클래스와 함수도 선언 할 수 있습니다 .

for(struct { int a; float b; } loop = { 1, 2 }; ...; ...) {
    ...
}

이는 유형이 다른 여러 변수를 허용합니다.


답변

배열 연산자는 연관 적입니다.

A [8]은 * (A + 8)의 동의어입니다. 덧셈은 연관성이므로 * (8 + A)로 다시 쓸 수 있습니다. 이것은 ……. 8 [A]의 동의어입니다.

유용하다고 말하지 않았는데 … 🙂