題目(13):編譯運行下圖中的C++代碼,結果是什么?(A)編譯錯誤;(B)編譯成功,運行時(shí)程序崩潰;(C)編譯運行正常,輸出10。請選擇正確答案并分析原因。
#include
class A
{
private:
int value;
public:
A(int n)
{
value = n;
}
A(A other)
{
value = other.value;
}
void Print()
{
std::cout << value << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a = 10;
A b = a;
b.Print();
return 0;
}
答案:編譯錯誤。在復制構造函數中傳入的參數是A的一個(gè)實(shí)例。由于是傳值,把形參拷貝到實(shí)參會(huì )調用復制構造函數。因此如果允許復制構造函數傳值,那么會(huì )形成永無(wú)休止的遞歸并造成棧溢出。因此C++的標準不允許復制構造函數傳值參數,而必須是傳引用或者常量引用。在Visual Studio和GCC中,都將編譯出錯。
題目(14):運行下圖中的C++代碼,輸出是什么?
int SizeOf(char pString[])
{
return sizeof(pString);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* pString1 = "google";
int size1 = sizeof(pString1);
int size2 = sizeof(*pString1);
char pString2[100] = "google";
int size3 = sizeof(pString2);
int size4 = SizeOf(pString2);
printf("%d, %d, %d, %d", size1, size2, size3, size4);
return 0;
}
答案:4, 1, 100, 4。pString1是一個(gè)指針。在32位機器上,任意指針都占4個(gè)字節的空間。*pString1是字符串pString1的第一個(gè)字符。一個(gè)字符占一個(gè)字節。pString2是一個(gè)數組,sizeof(pString2)是求數組的大小。這個(gè)數組包含100個(gè)字符,因此大小是100個(gè)字節。而在函數SizeOf中,雖然傳入的參數是一個(gè)字符數組,當數組作為函數的參數進(jìn)行傳遞時(shí),數組就自動(dòng)退化為同類(lèi)型的指針。
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/