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 驅動物件模...