C++顯式地允許delete操作將操作數左值置0,而且我曾經希望C++的實現能夠做到這一點,但這種思想看來并沒有在C++的實現中變得流行。
如果你認為指針置0很重要,考慮使用一個銷毀的函數:
template<class T> inline void destroy(T*& p) { delete p; p = 0; }
考慮一下,這也是為什么需要依靠標準庫的容器、句柄等等,來將對new和delete的顯式調用降到最低限度的另一個原因。
注意,通過引用來傳遞指針(以允許指針被置0)有一個額外的好處,能防止destroy()在右值上(rvalue)被調用:
int* f();
int* p;
// ...
destroy(f()); // 錯誤:應該使用一個非常量(non-const)的引用傳遞右值
destroy(p+1); // 錯誤:應該使用一個非常量(non-const)的引用傳遞右值
我能夠寫“void main()”嗎?
這種定義:
void main() { /* ... */ }
在C++中從未被允許,在C語言中也是一樣。參見ISO C++標準3.6.1[2]或者ISO C標準5.1.2.2.1。規范的實現接受這種方式:
int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
一個規范的實現可能提供許多版本的main(),但它們都必須返回int類型。main()返回的int值,是程序返回一個值給調用它的系統的方式。在那些不具備這種方式的系統中,返回值被忽略了,但這并不使“void main()”在C++或C中成為合法的。即使你的編譯器接受了“void main()”,也要避免使用它,否則你將冒著被C和C++程序員視為無知的風險。
在C++中,main()并不需要包含顯式的return語句。在這種情況下,返回值是0,表示執行成功。例如:
#include<iostream>
int main()
{
std::cout << "This program returns the integer value 0\n";
}
注意,無論是ISO C++還是C99,都不允許在聲明中漏掉類型。那就是說,與C89和ARM C++形成對照,當聲明中缺少類型時,并不會保證是“int”。于是:
#include<iostream>
main() { /* ... */ }
是錯誤的,因為缺少main()的返回類型。
為什么我不能重載點符號,::,sizeof,等等?
大多數的運算符能夠被程序員重載。例外的是:
. (點符號) :: ?: sizeof
并沒有什么根本的原因要禁止重載?:。僅僅是因為,我沒有發現有哪種特殊的情況需要重載一個三元運算符。注意一個重載了 表達式1?表達式2:表達式3 的函數,不能夠保證表達式2:表達式3中只有一個會被執行。
文章來源于領測軟件測試網 http://www.kjueaiud.com/