空指標也能呼叫成員函式?
最近各大公司都在招聘實習生,昨晚,微信公眾號推送了網易的筆試題讓小夥伴們參考,看了第一道題,博主就覺得“嗯,我果然還是見識短哈!”為什麼呢,我們先看看這個程式碼~
class cal
{
public:
void show()
{
cout << "cal::Show()" << endl;
}
};
int main()
{
cal *pcal = NULL;
pcal->show();
getchar();
return 0;
}
#endif
Q;該程式輸出的結果什麼?
博主毫不猶豫的選擇了“執行時崩潰”這個選項
然而。。。。真正的答案卻是這個指標可以正確的呼叫show()函式。。what?!why?!這不科學
懷著對科學嚴謹的態度(我要吐了),博主還是去別的大大的部落格轉了一圈。誒!?還真被我找到了,這到底是為什麼呢?
我們現在再看一段程式碼!
class cal
{
public:
cal() :a(10)
{}
void display()
{
cout << a << endl;
}
private:
int a;
};
int main()
{
cal *pcal = NULL;
pcal->display();
getchar();
return 0;
}
#endif
和上面的那段程式碼很像吧,但是呢,這段程式碼在執行的時候是會崩潰的,為什麼呢!?
仔細的你發現了沒,上面第一段程式碼裡,指標呼叫的函式沒有用到this指標,而這一段裡用到了,所以關鍵就在於你是否用到了this指標。
這是因為,我們在編寫一個類的時候,它的所有的物件共用了成員函式,所以在編譯期間我們就已經確定了成員函式的地址,而類又依靠this指標來區分各個不同的物件以便於找到正確的資料。對於第一個例子,它的this指標就等於NULL而show()是一個靜態型別的成員函式,在呼叫時不會傳this指標給它,所以我們可以順利的呼叫它,但是第二個例子中我們用到了類的資料a在呼叫時被編譯器解釋為this->a ,但是你得this是NULL啊,你指什麼啊!?
所以,你明白了嗎。。。
相關推薦
空指標也能呼叫成員函式?
最近各大公司都在招聘實習生,昨晚,微信公眾號推送了網易的筆試題讓小夥伴們參考,看了第一道題,博主就覺得“嗯,我果然還是見識短哈!”為什麼呢,我們先看看這個程式碼~class cal { publ
空指標也可以訪問成員函式?
今天在看多型,這一部分,寫了些驗證程式,發現下面的問題: #include <iostream> using namespace std; class Test{public: void TestNullPointer() { cout<<
this 指標的地址--呼叫成員函式的所在物件的起始地址
#include<iostream> using namespace std; class Test { int x; public: Test(int a){ x=a; } void get_this(); }; void Test:: get_this() { co
[C++]空的物件指標可以呼叫成員函式
include using namespace std; class A{ public: void func() { cout << "hahaha" << endl; } int m_num = 1; }; int main() { A* ptr = NULL; A obj;
c++中使用空指標呼叫成員函式的理解
使用空指標呼叫成員函式會如何? 舉個例子:base是基類,裡面有兩個函式:non-virtual func2 以及 virtual func1; derived是派生類,使用public繼承自base,裡面有四個函式:virtual func1,non-vi
詳解this指標--為什麼空的物件指標可以呼叫成員函式
引題 class A{ public: void function() { cout << "I can run" << endl; } }; int main() { A* pa =
空指標可以呼叫成員函式?
有下面一個簡單類: class A { public: void fun(){ cout << "I'm class A"<<endl; } }; 用一個空指標呼叫上面的fun函式: A* p
置空指標呼叫成員函式問題
問題由來:new一個自己的類,用完後delete指標,置空NULL 後,打斷點指標為空,但是依舊可以調用出類裡的函式,且編譯通 過了; 總結:在java,Python語言中是做不到這樣的,但是C++中可以,原因是其繫結方式不一樣;
[C++]類的空指標呼叫成員函式後,會發生什麼事?
類的例項呼叫成員函式的原理 其實不管是通過物件例項或指標例項呼叫,其實底層呼叫的過程都是一樣的,都是把當前物件的指標作為一個引數傳遞給被呼叫的成員函式。通過下面的相關例項程式碼進行檢驗: 實驗的C++程式碼 class Student { private: int age; public: Studen
在C/C++中的struct使用函式指標,而且在C++中的struct還能使用成員函式
1、函式指標 一般的函式指標可以這麼定義: int(*func)(int,int); 表示一個指向含有兩個int引數並且返回值是int形式的任何一個函式指標. 假如存在這樣的一個函式: int add2(int x,int y) {
C++基礎:類與物件(物件呼叫成員函式 this指標)
1.一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候
c++ 如何把this指標傳入成員函式 像全域性函式一樣呼叫成員函式
測試這個功能的初衷是測試boost裡面的bind boost::bind((&A::sum), &a, _1, _2) 上面的程式碼是我boost bind及多執行緒這篇部落格裡面的一行程式碼。我就想boost是怎麼做到這樣呼叫一個類的成員函式的。其實成員
成員函式指標和其他型別的強制轉換,使用一般指標呼叫成員函式
成員函式指標和其他型別之間的轉換,參見如下示例: class test...{public: void t()...{};};typedef void (test::*pMemFnction)(); int main()...{ pMemFnction
c++11呼叫成員函式mem_fn和適合普通函式指標
在C++11之前,呼叫一個成員函式指標做為容器的回撥演算法時,可以根據其容器記憶體儲的內容是物件還是指標呼叫相關的mem_fun和_mem_fun_ref函式來與演算法等進行適配,搭配使用。 在c++11中加入mem_fn來對成員函式的呼叫進行相關的封裝,不過也需要對方法
C語言用一級指標也能實現單鏈表
linklist.h #pragma once #include"stdlib.h" typedef struct LinkNode { //資料域 char* data; //指標域 struct LinkNode* next; }LinkNode,linklist; //初始化 Li
一般函式指標和類的成員函式指標
函式指標是通過指向函式的指標間接呼叫函式。函式指標可以實現對引數型別、引數順序、返回值都相同的函式進行封裝,是多型的一種實現方式。由於類的非靜態成員函式中有一個隱形的this指標,因此,類的成員函式的指標和一般函式的指標的表現形式不一樣。 1、指向一般函式的指標 函式指標的
C++中建構函式能呼叫虛擬函式嗎?
環境:XPSP3 VS2005 今天黑總給應聘者出了一個在C++的建構函式中呼叫虛擬函式的問題,具體的題目要比標題複雜,大體情況可以看如下的程式碼: class Base { public: Base() { Fuction(); }
[Phonegap+Sencha Touch] 移動開發76 讓cordova app訪問遠端網站也能呼叫cordova外掛功能
我相信,應該會有一些cordova開發者想過實現下面這種app: 使用cordova製作一個外殼app,用於瀏覽服務端部署的網站,這樣當伺服器上網站升級後,這個cordova app可以立即訪問最新版。而不是每次改了一點點功能都要打包上架app。 我最近也在實現這樣
記錄一次生產釋出事件——(簡單的非空驗證也能引發大問題)
歡樂小插曲 時間定格在週四——常規釋出日下午三點,研發任務早已完成、測試也無大礙。這時,辦公室外走廊裡傳來了一陣急促的報警聲——“此大樓發生緊急情況,請各單位抓緊撤離”。像往常一樣刷刷部落格園,坐等釋出生產的我聞聽此聲,虎軀一震正準備要跑路,轉頭看向周圍的同事。大都很淡定的坐在工位上各自擼碼。於是收回我那
空指標的成員函式呼叫
我一直認為技術是沒有止境的,不管你怎麼去學,總有你沒有掌握的地方。但是,人,是不能停下腳步的。 今天在檢查一個MFC程式,看到GetSafeHwnd函式,於是讓我想明白到底它比m_hWnd成員變數safe在哪裡?到網上查了一下資料,發現了GetSafeHwnd的