#include<iostream>
#include<string.h>
using namespace std;
class A
{
public:
static void f1(){ cout<<"f1"<<endl; }
void f2(){ cout<<"f2"<<endl; }
void f3(){ cout<<num<<endl; }
virtual void f4() {cout<<"f4"<<endl; }
public:
int num;
};
int main(int argc,char* argv[])
{
A* pa = NULL;
pa->f1(); //正常
pa->f2(); //正常
pa->f3(); //錯誤,提示段錯誤
pa->f4(); //錯誤,提示段錯誤
return 0;
}
分析
- pa->f1(); //正常 因爲f1不需要this指針所以不影響調用f1
- pa->f2(); //正常 雖然需要this指針但是因爲f2裏面沒有調用任何變量所以不會出現問題
- pa->f3(); //錯誤 因爲調用了類變量 相當於null->num的調用所以肯定會造成段錯誤
- pa->f4(); //錯誤 因爲調用了虛函數表指針 相當於 null->虛函數表指針所以也會造成段錯誤
同一類的不同對象,在調用相同的成員函數時,他們的入口地址是否相同?
是相同的因爲他們都存在了代碼區
什麼樣的機制來保證他們同時調用的時候不衝突,並且輸出是各自的結果的?
用this指針來保證他們的數據數據不發送衝突,因爲傳入的是不同this指針,所以得到的是不同的變量
const對象
存儲位置
const全局變量存在只讀數據段
const局部變量存在棧上,出作用域刪除
指針類型[函數也可以理解成爲地址]
根據c++最小權限原則 [可以理解爲const 對象權限變小是下級,非const權限大是上級 , 指針是工資]
const對象指針不能賦給非const對象指針 [下級不會給上級發工資]
非const對象指針可以賦給非const對象指針[上級可以給發工資]
const函數不能調用非const函數[下級不會給上級發工資]
非const函數可以調用const函數[上級可以給發工資]
非指針類型
非const變量賦給const變量是不行的,因爲const變量在初始化的時候就確定了是隻讀的就不能在進行修改數據,你進行賦值等於就是修改數據