2012-01-23 31 views
6

thể trùng lặp:
What will happen when I call a member function on a NULL object pointer?Tại sao có thể gọi hàm thành viên không tĩnh mà không có một cá thể đối tượng?

Vâng, tôi nghĩ rằng mã và chương trình đầu ra này giải thích nó tự:

#include <iostream> 
#include <string> 
using namespace std; 

class Test 
{ 
public: 
    void Not_Static(string args) 
    { 
     cout << args << endl; 
    } 
}; 

int main() 
{ 
    Test* Not_An_instance = nullptr; 
    Not_An_instance->Not_Static("Non-static function called with no object?"); 
    cin.ignore(); 
    return 0; 
} 

đầu ra chương trình:

Chức năng không tĩnh gọi là không có đối tượng?

tại sao điều đó lại có thể xảy ra?

+5

Vì hành vi không xác định nên mọi thứ đều có thể xảy ra. –

+0

@ FredLarson, mặc dù sự thật, nó không thực sự * giải thích * tại sao nó có thể. –

+0

Có thể bởi vì nó không phải là công việc của C++ để ngăn bạn bắn mình vào mặt. –

Trả lời

9

Hành vi không xác định. Chương trình của bạn gọi hành vi không xác định bằng cách gọi một phương thức trên một con trỏ rỗng, vì vậy mọi thứ đều được phép, bao gồm cả đầu ra của bạn.

Hãy nhớ rằng: đặc tả của ngôn ngữ C++ không chỉ định đầu ra của mọi chương trình có thể rời khỏi phòng để tối ưu hóa. Nhiều thứ không được kiểm tra rõ ràng và có thể dẫn đến hành vi có vẻ không chính xác hoặc phi logic, nhưng đơn giản là không xác định.

2

Vì nó không sử dụng this và do đó không trỏ đến con trỏ rỗng. Làm cho nó ảo và nó sẽ có khả năng thất bại.

5

Hành vi này không xác định - do đó, có thể nó sẽ in đầu ra đó. Vấn đề là hành vi không xác định có thể dễ dàng cắn bạn, vì vậy bạn không nên làm một điều như vậy.

Các vấn đề liên quan