內存函數地址const屬性操作淺談

#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;
}

分析

  1. pa->f1(); //正常 因爲f1不需要this指針所以不影響調用f1
  2. pa->f2(); //正常 雖然需要this指針但是因爲f2裏面沒有調用任何變量所以不會出現問題
  3. pa->f3(); //錯誤 因爲調用了類變量 相當於null->num的調用所以肯定會造成段錯誤
  4. pa->f4(); //錯誤 因爲調用了虛函數表指針 相當於 null->虛函數表指針所以也會造成段錯誤

同一類的不同對象,在調用相同的成員函數時,他們的入口地址是否相同?

是相同的因爲他們都存在了代碼區

什麼樣的機制來保證他們同時調用的時候不衝突,並且輸出是各自的結果的?

用this指針來保證他們的數據數據不發送衝突,因爲傳入的是不同this指針,所以得到的是不同的變量

const對象

存儲位置
const全局變量存在只讀數據段
const局部變量存在棧上,出作用域刪除

指針類型[函數也可以理解成爲地址]
根據c++最小權限原則 [可以理解爲const 對象權限變小是下級,非const權限大是上級 , 指針是工資]
const對象指針不能賦給非const對象指針 [下級不會給上級發工資]
非const對象指針可以賦給非const對象指針[上級可以給發工資]
const函數不能調用非const函數[下級不會給上級發工資]
非const函數可以調用const函數[上級可以給發工資]

非指針類型
非const變量賦給const變量是不行的,因爲const變量在初始化的時候就確定了是隻讀的就不能在進行修改數據,你進行賦值等於就是修改數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章