深度探索c 物件模型 6

2021-08-08 18:28:35 字數 1792 閱讀 5219

class foo

;

我是用的編譯器vs2015會報這樣的錯誤無法過載僅含返回型別不同的函式

當僅需讀_val時,呼叫const int val();當需要更改_val時,呼叫int val();,而現在由於c++不支援這種情況,那麼我們只能採取折衷的方案,第一種方法是,在讀寫的地方都使用int val();,對於僅需要讀的地方,這樣做破壞了程式的本意;第二種做法是在僅讀的地方,呼叫const int val();,這樣的話,在需要寫的地方,就必須要強制型別轉換,如:

foo test;  

foo *val = (foo *)&test.val();

那有沒有一種方法是可以同時支援這種定義的呢?

答案是有的,不過讓人感覺很**

#define get_data() \  

public:\

const

intval();\

int val();

class foo ;

不過我最近在測試時發現,這種做法在vs2015上不可行了。

但是不能放棄是吧,所以又有了這種做法 ,這種思路可以學習,但是在類裡面實現的時候碰到了一些問題。

然後還是不死心啊,所有就找啊找,終於又找到了一種方案

class my 

char getchar()

class proxy

operator

int() const

operator

char() const

};proxy get(my* i)

};

還有這種方案

class

my

對於placementoperator new(), 它的第乙個函式引數必須是std::size_t, 表示申請的記憶體的大小

void * operator

new (std::size_t) throw(std::bad_alloc); // 標準版本

void * operator

new (std::size_t, const

std::nothrow_t &) throw(); // placement 版本

在使用者自定義空間上構建物件, 是placement new的本意, 它也被做到c++標準中, 作為default placement:

void * operator

new (std::size_t, void * p) throw()

相應的 placement new expression 使用起來就是這樣:

void *buffer = malloc(sizeof(classa));

classa *ptr = new(buffer)classa();

實際上就是

operator

new (sizeof(classa), this);

由於建立物件時,operator new只能通過new關鍵字隱式呼叫,無法通過命名空間限定呼叫的版本,所以一旦在類中定義了operator new的過載版本,所有類外定義的operator new過載都會失效。

深度探索C 物件模型

傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷 譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你...

深度探索C 物件模型

傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你 ...

深度探索C 物件模型

深度探索c 物件模型 本書目錄結構如下 第1章 關於物件 object lessons 加上封裝後的布局成本 layout costs for adding encapsulation 1.1 c 模式模式 the c object model 簡單物件模型 a object model 驅動物件模...