Sizeof不能夠被重載是因為內建的操作(built-in operations),諸如對一個指向數組的指針進行增量操作,必須依靠它?紤]一下:
X a[10];
X* p = &a[3];
X* q = &a[3];
p++; // p指向a[4]
// 那么p的整型值必須比q的整型值大出一個sizeof(X)
所以,sizeof(X)不能由程序員來賦予一個不同的新意義,以免違反基本的語法。
在N::m中,無論N還是m都不是值的表達式;N和m是編譯器知道的名字,::執行一個(編譯期的)范圍解析,而不是表達式求值。你可以想象一下,允許重載x::y的話,x可能是一個對象而不是一個名字空間(namespace)或者一個類,這樣就會導致——與原來的表現相反——產生新的語法(允許 表達式1::表達式2)。很明顯,這種復雜性不會帶來任何好處。
理論上來說,.(點運算符)可以通過使用和->一樣的技術來進行重載。但是,這樣做會導致一個問題,那就是無法確定操作的是重載了.的對象呢,還是通過.引用的一個對象。例如:
class Y {
public:
void f();
// ...
};
class X { // 假設你能重載.
Y* p;
Y& operator.() { return *p; }
void f();
// ...
};
void g(X& x)
{
x.f(); // X::f還是Y::f還是錯誤?
}
這個問題能夠用幾種不同的方法解決。在標準化的時候,哪種方法最好還沒有定論。更多的細節,請參見《C++語言的設計和演變》。
怎樣將一個整型值轉換為一個字符串?
最簡單的方法是使用一個字符串流(stringstream):
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
string itos(int i) // 將int轉換成string
{
stringstream s;
s << i;
return s.str();
}
int main()
{
int i = 127;
string ss = itos(i);
const char* p = ss.c_str();
cout << ss << " " << p << "\n";
}
自然地,這種技術能夠將任何使用<<輸出的類型轉換為字符串。對于字符串流的更多說明,參見《C++程序設計語言》21.5.3節。
“int* p”正確還是“int *p”正確?
二者都是正確的,因為二者在C和C++中都是有效的,而且意義完全一樣。就語言的定義與相關的編譯器來說,我們還可以說“int*p”或者“int * p”。
在“int* p”和“int *p”之間的選擇與正確或錯誤無關,而只關乎風格與側重點。C側重表達式;對聲明往往比可能帶來的問題考慮得更多。另一方面,C++則非常重視類型。
一個“典型的C程序員”寫成“int *p”,并且解釋說“*p表示一個什么樣的int”以強調語法,而且可能指出C(與C++)的語法來證明這種風格的正確性。是的,在語法上*被綁定到名字p上。
一個“典型的C++程序員”寫成“int* p”,并且解釋說“p是一個指向int的指針類型”以強調類型。是的,p是一個指向int的指針類型。我明確地傾向于這種側重方向,而且認為對于學好更多的高級C++這是很重要的。
嚴重的混亂(僅僅)發生在當人們試圖在一條聲明中聲明幾個指針的時候:
int* p, p1; // 也許是錯的:p1不是一個int*
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/