이 문제를 자세히 알아보려면 다음 예를 고려하세요.
이 스니펫에서는 클래스 테스트가 정의됩니다. 생성자와 show() 메소드를 사용합니다. main() 함수에서는 포인터 ptr이 NULL로 초기화된 후 ptr을 통해 show() 메서드가 호출됩니다.
놀랍게도 프로그램은 오류 없이 실행되고 생성자를 트리거하지 않고 "show fun Called"를 인쇄합니다. . 이는 C에서 컴파일러가 널 포인터의 유형을 알고 있어 메소드의 코드를 식별할 수 있기 때문입니다. show() 메소드는 this 포인터를 활용하지 않기 때문에 성공적으로 실행됩니다.
그러나 이 동작은 C 표준에서 정의되지 않은 것으로 간주됩니다. 컴파일러는 메서드를 호출하기 전에 포인터가 NULL인지 확인하지 않음으로써 코드를 최적화할 수 있습니다. 이러한 최적화는 효율성을 향상시키지만 안전성과 예측 가능성을 저하시킵니다.
<code class="cpp">#include <iostream>
using namespace std;
class test
{
int i;
public:
test():i(0){ cout << "ctor called" << endl;}
void show()
{
cout << "show fun called" << endl;
}
};
int main(int argc , char *argv[])
{
test *ptr = NULL;
ptr->show();
return 0;
}</code>
로그인 후 복사
위 내용은 C에서 널 포인터를 통해 메소드를 호출하는 것이 때때로 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!