@陳梓瀚(vczh)
用不變量來表示狀態碉堡了,呵呵,我以前怎么沒想到。這樣能區分POD和class。云風說沒有狀態估計說的是POD。
我覺得contract并不僅僅指能做什么事情,還包括做事情前后的狀態應該是什么樣子
typedef int(__stdcall*f[10])(int(*a)(int, int));
這個不是:“f是一個數組,數組返回了一個函數指針,……”。數組不會返回什么東西的啊。我覺得用typedef來解釋更清楚。上面的typedef等價于:
typedef int (*A)(int, int);
typedef int (__stdcall*F)(A);
F[10];
re: const形參的函數重載[未登錄] raof01 2009-11-04 11:18
RET XXX::FUNC(...) const;和
RET XXX::FUNC(...);
也構成重載
社會化大生產的方式決定了不可能把每個人都發揮到極致的,而是選取每個人的特長來進行組合。
很多好的軟件,不是天才的設計,便是經驗老道的設計。初出茅廬的,可能還在技術細節層面糾纏呢。不妨問自己:我是天才嗎?我經驗足夠嗎?
“別人把軟件設計好,詳細到偽碼級別了,我只是來做最低級的實現而已。”樓主意識到這個并開始有想法是好的,只不過別太著急了。
最后,兩個聰明人合作會使事情變糟,那是因為他們不夠聰明,或者說光有智商沒有情商。解雇之。寧要情商,不要智商。古往今來成功人士,智商高的有多少不好說,但情商絕對都是咣咣的。
re: In the USA - 4[未登錄] raof01 2008-12-23 22:35
謝謝了先
re: In the USA - 4[未登錄] raof01 2008-12-23 22:34
我試了下練習1.6,好像永遠都算不完,為什么呢?練習1.7呢?我沒有思路。
第一,是bitwise initialization,member-wise copy。——這話是Inside C++ Object Model里說的,我也認同這種觀點。
第四,不會遞歸調用基類CCF,但會遞歸調用個成員的CCF。——越俎代庖,做個補充:)
@jmchxy
按成員遞歸復制。不是按位復制。
其他同意你的觀點。
@匿名
每個人成功的標準都不一樣。
趁著年輕努力工作學習。
大體上很贊同博主。這些是任何一個有責任感的人都必須做到的。
re: C++類型轉換符的使用[未登錄] raof01 2008-10-17 11:10
BS的TC++PL
我也覺得codeblocks好用。如果在linux上,vim+plugins會是相當好的選擇,anjuta也不錯。
當然,如果在win上開發app或者做prototype,還是vs比較好,畢竟是RAD工具嘛。
如果不做RAD,自己編寫makefile和腳本來管理src樹、進行開發能極大提高效率
re: C++類型轉換符的使用[未登錄] raof01 2008-09-28 10:10
reinterpret_cast:重新解析位模式bit pattern。
如:
TYPE * t = new TYPE();
unsigned long ul = reinterpret_cast<unsigned long>(t);
delete t;
為你的努力鼓掌。
但是……我覺得這些沒有必要翻譯過來。一個合格的程序員,一定要feel comfortable with English。全世界都是如此
強烈反對盜版
強烈反對M$
強烈盼望人民收入水平大幅提高
強列盼望加大打擊盜版的力度
靠,別誤會了,只是說這篇應當參考TCPL,寫得簡潔點。
re: 《星際爭霸2》引擎技術解析[未登錄] raof01 2008-09-03 09:36
對圖形學沒概念。飄過
@David Lee
類里面的函數是成員函數,不可能是全局的。
static成員函數不是全局的,它的scope是類,在全局范圍內可以訪問,但不是全局函數。因為它操作的是該類相關的東西。類里面是不會有global scope的東西的。c++中訪問全局函數應該使用::。
內存上應該一樣(not very sure),都是獨立于對象存在的。區別是static成員函數沒有隱含的this參數而普通成員函數有。
@sPhinX
M$的東西與GCC有差異。各自實現了標準的大部分,有自己的擴展。對于標準中“it depends”的東西就形態各異了。
另外,const的保證是由編譯器來保證的,你看我畫的那個圖。
就算構造const對象,也需要修改這個內存啊。對象構造完成const才能起作用,否則怎么構造/初始化?
第三條結論怎么得出的?
分析得不錯,就是有點麻煩。TCPL里指針講得比較好,簡明扼要。
re: 請教 關于 delete的用法[未登錄] raof01 2008-09-01 10:00
代碼沒問題。M$對C++做了修改,這是不兼容標準的地方
re: 宏和inline的區別[未登錄] raof01 2008-09-01 09:48
宏是簡單的字符串替換。
inline是將代碼插入到調用點——并非原封不動插入。compiler有權決定是否真的inline。
re: 車通 面試題[未登錄] raof01 2008-08-29 11:23
malloc后沒有free。破題
第二題是悖論。類里聲明的函數有全局的?新鮮。賜教?
re: 莫名科技面試題[未登錄] raof01 2008-08-29 10:01
結果 4 11 100 400 4 3 4 6 8 4 4
這個與機器有關。考題應當避免任何與特定平臺相關的東西,除非考的就是某平臺。
char->int轉換是promotion,無需static_cast。reinterpret_cast用于重新解釋(reinterpret)bit pattern。
只有第10題稱得上夠勁——描述不清楚啊,哈哈:
1、內核與用戶之間拷貝?
2、src和dest有重疊?
3、考慮效率?
4、訪問權限?
5、src和dest均非NULL但是否可訪問?
……
啥公司啊,一看題就知道不咋地。
re: (轉)const 的用法(2)[未登錄] raof01 2008-08-29 09:44
其實當把const int X = 10;放到頭文件中作為全局變量,這是X就有了internal linkage,可以將其作為常量使用,T a[x];不再非法。
re: C++ 拷貝構造函數(轉)[未登錄] raof01 2008-08-29 09:32
re: C++中常見名詞解釋[未登錄] raof01 2008-08-29 09:27
兄弟你把IDE里的概念和C++本身的概念混淆了。查一下C++標準,就沒有AppWizard。
@白金漢宮
老譚居然還會c++?肯定是垃圾。C++最好的入門書是BS的TC++PL。
const:表明該對象是read only的,也可以用來表示常量,但不是所有的編譯器都支持這個特性。這也就是為什么const int X = 10; T a[X];在使用某些編譯器編譯時是非法的。
* 用來保護對象不受修改。
* const成員函數,只能訪問const成員——當然不包括logical constness。
* const參數,表明該參數不可被函數修改,一般作用于T*或者T&。
* T * const和T const *(const T*)的區別。從右向左讀就能明白區別。傳參時,T * const與T*等價。還有const T * const,表明該對象以及其指向的對象都是read only的。
* const返回值:返回的對象是readonly的。
Base* b = (Base*)100;
Derived* d1 = reinterpret_cast( b );
Derived* d2 = static_cast( b );
這三句有問題。至少g++無法編譯。
re: C語言作用域、聲明以及定義[未登錄] raof01 2008-08-28 14:49
對于obj1來說,通過ptr修改obj2并沒有修改obj1所引用的內存區。這個obj1的bit pattern不變。
昨天看見你給我的評論,今天就看見這個了。:)
這里并不是打破了bitwise constness。如圖:
obj1
------
| data1|
|------| obj2
|ptr---+--> -----------------
------ |Can be modified |
|without breaking |
|bitwise constness|
-----------------
re: 對臨時變量的引用[未登錄] raof01 2008-08-27 15:39
能否操作臨時變量,就看你有沒有辦法獲取他的地址。
re: 對臨時變量的引用[未登錄] raof01 2008-08-27 15:38
@<a href=
http://minidx.com>minidxer</a>
臨時變量是可以操作的
如:
int main()
{
long l = 2222;
char const &s = l;
int *p = reinterpret_cast<int*>(const_cast<char *>(&s));
*p = 88;
printf("%ld, %c\n", l, s);
return 0;
}
考慮這種情況:
void foo()
{
int const a = 10;
}
如果const默認是static,那么上面的函數應該等價于:
void foo()
{
static int a = 10;
}
可能嗎?
考慮這種情況:
void foo()
{
int const a = 10;
a++;
}
如果const默認是static,那么上面的函數應該等價于:
void foo()
{
static int a = 10;
a++;
}
可能嗎?
(*it).m;
it->m;
與
(*it)->m;
相同嗎?
OMG!看了這么多留言才知道,只有kevin lynx和博主——當然也包括本人——知道討論的是什么問題。
IMHO,其他人該好好鞏固一下基礎了。
@abettor,@theanswerzju
IMHO,你們對于變量的定義理解存在問題。參考“C/C++:如何理解復雜的聲明”(
http://blog.chinaunix.net/u/12783/showart_378340.html)。
變量定義一次就分配一次存儲。多次包含global.h,則多次為STR_TEST分配空間。編譯器正常是因為分開編譯。鏈接異常是因為有多個存儲叫做STR_TEST,通過STR_TEST引用存儲存在二義性。
而且inclusion guard是防止一個h被重復包含,而不是在一個cpp里重復包含。最基礎的書籍關于這點也是很清楚的。
與inclusion guard無關。
const 變量默認是 static 的?誰說的?
multiple definition并不是由其constness不正確而導致的。
char * const p = "....";(p為常量,存放在常量表中,鏈接時沒問題)或者static char * p = "....";(限制p的作用域為編譯單元,但p可修改)即可,因為字符串本身是字面常量,不能修改。
因此,你這里的錯誤是由于全局變量使用錯誤導致的,與const無關。按照你最初的定義,在多個cpp中包含該global.h就相當于多次定義了STR_TEST。因此鏈接時會出錯。
const char STR_TEST[] = "Hello world!";這里有個拷貝操作,相當于多用了一倍的空間。
建議你看看“C++:一些基礎知識”(
http://blog.chinaunix.net/u/12783/showart_548200.html)3和4條