2017-08-01 20 views
5

Điều gì xảy ra, Nếu gọi chức năng thành viên dễ bay hơi sử dụng đối tượng không dễ bay hơi?Gọi hàm thành viên dễ bay hơi khi không sử dụng đối tượng dễ bay hơi trong C++

#include <iostream> 
using namespace std; 

class A 
{ 
private: 
    int x; 
public: 
    void func(int a) volatile //volatile function 
    { 
     x = a; 
     cout<<x<<endl; 
    } 
}; 

int main() 
{ 
    A a1; // non volatile object 
    a1.func(10); 
    return 0; 
} 
+2

Nó sẽ được gọi là bình thường. –

+0

Phrasing đẹp để tránh [this] (https://stackoverflow.com/questions/4826719/c-volatile-member-functions), [this] (https://stackoverflow.com/questions/16746070/what-does- it-mean-when-a-member-function-là-volatile) và [this] (https://stackoverflow.com/questions/2444734/what-is-the-purpose-of-a-volatile-member- function-in-c) là một dupe chính xác. – StoryTeller

Trả lời

7

Quy tắc là tương tự như chức năng const thành viên. Hàm volatile thành viên có thể được gọi trên đối tượng không volatile, nhưng không thể gọi hàm thành viên không volatile trên đối tượng volatile.

Trong trường hợp của bạn, A::func() sẽ được gọi là tiền phạt. Nếu bạn làm cho họ đối diện, việc biên dịch sẽ thất bại.

class A 
{ 
private: 
    int x; 
public: 
    void func(int a) // non-volatile member function 
    { 
     x = a; 
     cout<<x<<endl; 
    } 
}; 

int main() 
{ 
    volatile A a1; // volatile object 
    a1.func(10);  // fail 
    return 0; 
} 
4

Bạn có thể gọi nó giống như chức năng const trên đối tượng không phải const, nhưng vì các lý do khác nhau.

Bộ định tính volatile làm cho thông số này ngầm định được coi là con trỏ đến đối tượng dễ bay hơi.

Về cơ bản, điều này có nghĩa là ngữ nghĩa của các đối tượng dễ bay hơi sẽ được áp dụng khi truy cập (các) thành viên dữ liệu của đối tượng. Bất kỳ đọc của x không thể được tối ưu hóa đi, ngay cả khi trình biên dịch có thể chứng minh không có viết gần đây sau khi đọc cuối cùng.

Đương nhiên, nếu đối tượng không thực sự dễ bay hơi thì phần thân của func vẫn chính xác, mặc dù không được tối ưu hóa như nó có thể. Vì vậy, bạn có thể gọi nó là tốt.

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