2013-07-31 6 views
1

초기화되지 않은 개체에 대해 클래스 멤버 함수를 사용할 수있는 이유는 무엇입니까 (적어도 초기화되지 않았다고 생각합니다). 오류없이 다음 실행 : 지금초기화없이 클래스 멤버 함수 사용

// main.cc 
#include <iostream> 
#include "A.h" 

int main(int argc, char **argv) { 
    A *myClass; 
    std::cout << myClass->bar(5) << "\n"; 
} 

// A.h 
class A { 
public: 
    explicit A(int n) : n_(n) {}; 
    ~A() {}; 
    int foo() { 
    return n_; 
    }; 
    int bar(int i) { 
    return i; 
    }; 
private: 
    int n_; 
}; 

는 확실히 myClass->foo(); 실패 시도하지만, 우리가 선언 한 모든 A에 대한 포인터가 존재 때 왜 우리는 심지어 bar()을 사용할 수 있습니다 myClass이라고합니다. 이 허용 코딩 스타일입니까 /이 방법을 사용하는 이유가 있습니까?

+3

정의되지 않은 동작을 안녕하세요. –

+0

클래스와 연관된 함수를 호출 할 수 있기를 원하지만 정적 함수를 사용하는 멤버 함수가 아닙니다. – IdeaHat

+0

실제로 초기화되지 않은 개체가 아닙니다. A 형의 객체는 전혀 없습니다. – aschepler

답변

1

why can we even use bar() when all we've declared is that a pointer to A exists, and is called myClass ?

일반적으로 컴파일러는 포인터가 런타임에 유효할지 여부를 알 수 없습니다. 따라서이 오류를 진단 할 필요가 없습니다. 그러나이 경우 괜찮은 컴파일러는 경고를 표시하지 않고 빌드하지 않는 한 경고를 발행 할 수 있어야합니다.

Is this acceptable coding style/is there ever a reason to use this approach?

절대적으로 아닙니다. 잘못된 포인터를 역 참조하면 정의되지 않은 동작이 발생합니다.

0

myClass가 가리키는 메모리 블록이 초기화 된 개체인지 여부를 알 수 없으므로 올바른 구문이지만 정의되지 않은 동작이 발생하지만 방지하려면 -Wall 또는 비슷한 컴파일러 옵션을 사용해야합니다 (컴파일러에 따라 다름) 초기화되지 않은 포인터에 대해 경고합니다.

관련 문제