第一題
以下C++代碼會輸出什么?
#include <iostream>
using namespace std;
class A
{
public:A() {}~A() {}
private:static int a;
};
int main() {cout << sizeof(A) << endl;return 0;
}
A:0
B:1
C:4
D:8
答案及解析 B
首先,成員函數不存在于實例化對象 中,其次static定義的靜態成員變量不屬于任何一個對象,是屬于整個類的,也不存在實例化對象中。所以這個類其實啥都沒有,記住,什么都沒有存的類是默認一個字節的,所以選擇B
相關博客:C/C++內存對齊規則(結構體、聯合體、類)-CSDN博客
第二題
不考慮任何編譯器優化(如:NRVO),下述代碼第10行會發生()
#include <stdio.h>
class B
{};
B func(const B& rhs)
{return rhs;
}
int main()
{B b1, b2;b2 = func(b1);??//10
}
A:一次默認構造函數,一次拷貝構造函數,一次析構函數,一次(拷貝賦值運算符)operator=
B:二次拷貝構造函數,一次析構函數
C:一次(拷貝賦值運算符)operator=,一次析構函數
D:一次拷貝構造函數,一次析構函數,一次(拷貝賦值運算符)operator=
答案及解析 D
注意說的是第十行,所以不用考慮B b1,b2;
而第十行,首先是調用函數func,由于是引用傳參,不需要拷貝構造,但是在返回值這里需要拷貝一個臨時變量tmp,用臨時變量tmp來返回,所以b2 = tmp;所以這里就是調用的賦值運算符重載函數,然后tmp調用析構函數,因為這個臨時變量他tmp完成它的任務來,就會被銷毀;
第三題
3. 在32位系統中,關于下面程序說法正確的是()
class Item
{
private:char *desc;int storage;
public:Item()
{desc = new char[51];}void setInfo(char *dsrc, int num)
{strcpy(desc,dsrc); storage = num;}
};int main()
{Item stock; stock.setInfo("pen",20);return 0;
}
A:main函數定義了一個stock對象占8個字節
B:storage和desc成員各占4個字節
C:存在內存泄漏的問題
D:存在編譯錯誤
答案及解析?ABC
A:stock是Item這個類的實例化對象,占了8個字節,指針在32位機器上是4字節,int是4字節,通過內存對齊,為8字節; 不懂的可以看這篇博客: C/C++內存對齊規則(結構體、聯合體、類)-CSDN博客B???????B
B:正確,int類型4字節,32位的指針類型為4字節
C:存在內存泄漏,因為我們在構造函數這里開辟了空間,沒有釋放
D:不存在編譯錯誤
第四題
4. 對靜態成員的正確描述是()?
A:靜態數據成員要在類外定義和初始化
B:非靜態成員函數也可以操作靜態數據成員
C:全局變量、靜態全局變量和靜態局部變量都存放在內存的靜態存儲區域,局部變量存放在內存的棧區
D:調用靜態成員函數時要通過類或對象激活,所以靜態成員函數擁有this指針
答案及解析? B C
A:靜態成員變量,在類里面聲明,在類外面定義;
B:因為靜態成員變量,是屬于整個類的,所以并不需要this指針,非靜態成員函數可以不使用this指針直接用靜態成員變量;
C:全局變量,靜態變量存在靜態區,局部變量存在棧;
D:靜態成員函數是沒有this指針的,因為也是屬于整個類的;
第五題
5. 以下程序打印的兩個字符分別是()
#include<stdio.h>
#include<iostream>
using namespace std;
struct object
{char data[3];
};int main()
{object obj_array[3] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}};object *cur = obj_array;printf("%c %c\n", *(char *)((char *)(cur) + 2), *(char *)(cur + 2));return 0;
}
A:c g
B:b d
C:g g
D:g c
答案及解析?A
本題是考查對指針的加整數的考查;
obj_array[3] 這個是存放的字符串的結構體數組,數組每個元素都是字符串;
我們用cur指針指向這個結構體數組的首元素;
我們(char*)cur 是強制類型轉換成char類型,目的就是在+2的時候,移動的是兩個字節;
所以移動到c位置,(char*) 再強制類型轉換一下,是為了解引用的時候取的也是一個char類型,所以就是c,下一個同理;
用圖表示: