1. 程式人生 > >C++類物件空指標訪問成員函式(靜態繫結)

C++類物件空指標訪問成員函式(靜態繫結)

題目:

class A{
    public:
    void test(){printf("test A");}
};
int main(){
    A*pA=NULL;
    pA->test();
}

結果是輸出“test A”而不是程式崩潰,原因如下:

一種解釋:

A*pA=null;
pA->test();//當呼叫成員函式時,只是將實參null傳給this指標

  • test成員函式中並無任何需要通過this指標訪問的資料成員,因此沒有帶來任何影響

會崩潰的情況,呼叫的成員函式需要通過this指標訪問類的資料成語

#include<stdio.h>
class A{ public: void test1(){ printf("test 1"); } void test2(){ printf("test 2%d",data); } private: int data = 10; }; int main(){ A*pA = NULL; pA->test1();//成功輸出”test 1" pA->test2();//程式崩潰(注意不是編譯錯誤) return 0; }

結果:執行時崩潰
- 0x00E013E8 處有未經處理的異常(在 code_test.exe 中): 0xC0000005: 讀取位置 0x00000000 時發生訪問衝突。

跟詳細的解釋:從c++靜態繫結談起

因為對於非虛成員函式,C++這門語言是靜態繫結的。這也是C++語言和其它語言Java, Python的一個顯著區別。以此下面的語句為例:

pA->test();
這語句的意圖是:呼叫物件 pA 的 test 成員函式。如果這句話在Java或Python等動態繫結的語言之中,編譯器生成的程式碼大概是:

找到 pA 的 test 成員函式,呼叫它。(注意,這裡的找到是程式執行的時候才找的,這也是所謂動態繫結的含義:執行時才繫結這個函式名與其對應的實際程式碼。有些地方也稱這種機制為遲繫結,晚繫結。)

但是對於C++。為了保證程式的執行時效率,C++的設計者認為凡是編譯時能確定的事情,就不要拖到執行時再查找了。所以C++的編譯器看到這句話會這麼幹:
1. 查詢 pA 的型別,發現它有一個非虛的成員函式叫 test 。(編譯器乾的)
2. 找到了,在這裡生成一個函式呼叫,直接調A:: test ( pA )。

所以到了執行時,由於 test ()函式裡面並沒有任何需要解引用 pA 指標的程式碼,所以真實情況下也不會引發segment fault。這裡對成員函式的解析,和查詢其對應的程式碼的工作都是在編譯階段完成而非執行時完成的,這就是所謂的靜態繫結,也叫早繫結。

正確理解C++的靜態繫結可以理解一些特殊情況下C++的行為。

相關推薦

C++物件指標訪問成員函式靜態

題目: class A{ public: void test(){printf("test A");} }; int main(){ A*pA=NULL; pA->test(); } 結果是輸出“test A”而不是

C++物件指標訪問成員函式

題目: class A{ public: void test(){printf("test A");} }; int main(){ A*pA=NULL; pA->test(); } 結果是輸出“test A”而不是程式崩潰,原因如下: 一種解

[C++]指標呼叫成員函式後,會發生什麼事?

類的例項呼叫成員函式的原理 其實不管是通過物件例項或指標例項呼叫,其實底層呼叫的過程都是一樣的,都是把當前物件的指標作為一個引數傳遞給被呼叫的成員函式。通過下面的相關例項程式碼進行檢驗: 實驗的C++程式碼 class Student { private: int age; public: Studen

C++----指標訪問成員函式

//空指標訪問成員函式; class Person { public: void show() { cout << "Person show" << endl; } void showage() { cout << m_Age <

c++中使用指標呼叫成員函式的理解

使用空指標呼叫成員函式會如何? 舉個例子:base是基類,裡面有兩個函式:non-virtual func2 以及 virtual func1; derived是派生類,使用public繼承自base,裡面有四個函式:virtual func1,non-vi

的六個預設成員函式未完待續

1. 建構函式   程式中常需要對變數賦初值進行初始化,這在基於過程的程式中是很容易的,在定義變數時賦以初值,比如: int a = 10;   而在基於物件的設計中,在定義一個物件時,也需要做初始化的工作,即對成員變數賦初值進行初始化。物件代表一個實體,

C++物件.四個預設成員函式賦值運算子過載

1.(1)類的定義   類就是具有相同資料和相同操作的一組物件的集合。 學生類定義: class student {//成員變數char* name;int age;int sex;//成員函式void speak(){cout<<name<<"年

6.9 複數物件的加法運算-成員函式

#要求定義成員函式實現2個複數物件的加法運算。 提示:複數的加法按照以下規定的法則進行:設z1=a+bi,z2=c+di是任意兩個複數,則它們的和z3是 (a+bi)+(c+di)=(a+c)+(b+d)i. 解題思路: 在類當中除了能夠包含資料項int double char等型別,當

指標成員函式呼叫

我一直認為技術是沒有止境的,不管你怎麼去學,總有你沒有掌握的地方。但是,人,是不能停下腳步的。     今天在檢查一個MFC程式,看到GetSafeHwnd函式,於是讓我想明白到底它比m_hWnd成員變數safe在哪裡?到網上查了一下資料,發現了GetSafeHwnd的

c++ 如何把this指標傳入成員函式 像全域性函式一樣呼叫成員函式

測試這個功能的初衷是測試boost裡面的bind boost::bind((&A::sum), &a, _1, _2) 上面的程式碼是我boost bind及多執行緒這篇部落格裡面的一行程式碼。我就想boost是怎麼做到這樣呼叫一個類的成員函式的。其實成員

指標呼叫成員函式問題

問題由來:new一個自己的類,用完後delete指標,置空NULL 後,打斷點指標為空,但是依舊可以調用出類裡的函式,且編譯通                    過了; 總結:在java,Python語言中是做不到這樣的,但是C++中可以,原因是其繫結方式不一樣;

將例3.14改寫為在模版外定義各成員函式第三章第十二題

#include <iostream> using namespace std; template<class numtype> class Compare {public: Compare(numtype a,numtype b); numtype

C語言結構體裡的成員陣列長度為0指標---from coolshell

單看這文章的標題,你可能會覺得好像沒什麼意思。你先別下這個結論,相信這篇文章會對你理解C語言有幫助。這篇文章產生的背景是在微博上,看到@Laruence同學出了一個關於C語言的題,微博連結。微博截圖如下。我覺得好多人對這段程式碼的理解還不夠深入,所以寫下了這篇文章。

C++面向物件程式設計50道程式設計題第05題

C++面向物件程式設計50道程式設計題(第05題) 摘要:C++程式設計實習是為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析問題和解決問題的能力,提高學生運用所學知識解決實際問題的能力。   本專輯為程式設計入門者、高校計算機軟體

C++面向物件程式設計50道程式設計題第13題

C++面向物件程式設計50道程式設計題(第13題) 摘要:C++程式設計實習是為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析問題和解決問題的能力,提高學生運用所學知識解決實際問題的能力。   本專輯為程式設計入門者、高校計算機軟體

C++面向物件程式設計50道程式設計題第12題

C++面向物件程式設計50道程式設計題(第12題) 摘要:C++程式設計實習是為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析問題和解決問題的能力,提高學生運用所學知識解決實際問題的能力。   本專輯為程式設計入門者、高校計算機軟體

C++面向物件程式設計50道程式設計題第11題

C++面向物件程式設計50道程式設計題(第11題) 摘要:C++程式設計實習是為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析問題和解決問題的能力,提高學生運用所學知識解決實際問題的能力。   本專輯為程式設計入門者、高校計算機軟體

# C++面向物件程式設計50道程式設計題第10題

C++面向物件程式設計50道程式設計題(第10題) 摘要:C++程式設計實習是為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析問題和解決問題的能力,提高學生運用所學知識解決實際問題的能力。   本專輯為程式設計入門者、高校計算機軟體

C++面向物件程式設計50道程式設計題第09題

C++面向物件程式設計50道程式設計題(第09題) 摘要:C++程式設計實習是為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析問題和解決問題的能力,提高學生運用所學知識解決實際問題的能力。   本專輯為程式設計入門者、高校計算機軟體

C++面向物件程式設計50道程式設計題第08題

C++面向物件程式設計50道程式設計題(第08題) 摘要:C++程式設計實習是為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛鍊學生的分析問題和解決問題的能力,提高學生運用所學知識解決實際問題的能力。   本專輯為程式設計入門者、高校計算機軟體