騰訊2013實習生招聘筆試題目(1)

1、下面錯誤的有:
int i; 
char a[10]; 
string f();  
string g(string &str);   

A. if(!!i){f();}  B. g(f());  C. a=a+1;  D. g("abc");

A和C比較容易判斷:A真確,C錯誤。ios

對於B和D,狀況要複雜一些: (MyString爲自定義string)函數

(1) 函數參數爲非MyString引用的狀況

void g(const MyString str)  // 或者沒有const
{
}

int main(void)
{
    MyString a;
    g(a);
    cout << "end" << endl;
    return 0;
} 輸出: MyString()
// 生成a的時候輸出 copy constructor // 生成str的時候輸出 ~MyString() // g函數執行完畢時,str析構時輸出 end ~MyString() // a析構時輸出

--------------------------------------------------
int main(void)
{
g("abc");
return 0;
}
輸出:

MyString(const char *pData)

 ~MyString()spa

 
2、函數參數爲MyString的引用的時候

void g(MyString &str)
{
}

int main(void)
{    
    MyString a;
    g(a);

    cout << "end" << endl;
}

輸出:
MyString()
end
~MyString()
----------------------------------
int main(void)
{
g("abc");
// 此處出現編譯錯誤。爲了便於解釋,做如下處理
// const MyString temp("abc");
// g(temp);
// 實參是const對象,可是形參倒是很是量引用,因此報錯
// 若是函數g改成 void g(const MyString &str),則g("abc")是正確的
return 0;
}

 

3、函數的返回值爲基本數據類型和類對象的時候

#include<iostream>
using namespace std;

class A
{};

A getA()
{
    A a;
    return a;
}

int getInt()
{
    return 6;
}

int main(void)
{
    A x;
    getA() = x;    //ok,臨時的對象可尋址
    getInt() = 6;  //error,臨時的基本數據類型不可尋址

    return 0;
}
4、函數g和f結合起來
MyString f()
{
    MyString a("hello");
    return a;
}

void g(MyString &str)
{
}

int main(void)
{
        g(f());
        // 能夠理解爲 函數f返回時經過拷貝構造函數生成了MyString類的一個對象temp,
        // g(temp); 若是函數f變爲 const MyString f(),則g(f())明顯是錯誤的。
        retrun 0;
}

輸出:
MyString(const char *pData)
copy constructor
~MyString()
~MyString()
相關文章
相關標籤/搜索