幾道C 筆試題

2021-09-22 08:43:17 字數 1457 閱讀 7839

#include using

namespace

std;

class

a

void

fun()

virtual

void

print()

intm;

};class b: publica}

intmain()

上例執行結果表明:

1.建構函式中呼叫虛函式,無法實現多型。

2.通過非虛函式呼叫虛函式,也可以實現多型。

#include #include 

using

namespace

std;

class

a

virtual

void

print()

private

:

//string s;

intm;

};class b: publica};

intmain()

上面的**,使用memset(this,0,sizeof(*this));對乙個類a進行初始化,類a的虛表被破壞,在使用a的指標並指向a的例項的時候會崩潰。因為通過指標呼叫,編譯器會檢測虛函式表,檢查是否是多型,這時候虛函式表已經被破壞,就會崩潰。如果是通過例項呼叫,不會是多型,因為函式是靜態繫結的,就沒有崩潰。

如果在類a中加乙個成員變數:string s; 程式會崩潰,因為memset()破壞了string(如果是其他的容器如vector等,也會崩潰)。

如果在類b的造函式用memset(this,0,sizeof(*this));初始化,類b的虛函式表被破壞,動態呼叫虛函式時會崩潰。

用c的方式memset初始化乙個類,是不被推薦的,這樣做會破壞掉c++類中一些資訊,如虛函式表、基類的資訊等。

什麼樣的型別可以用memset()初始化?

pod型別的可以:

pod類型別就是指class、struct、union,且不具有使用者定義的建構函式、析構函式、拷貝運算元、賦值運算元;不具有繼承關係,因此沒有基類;不具有虛函式,所以就沒有虛表;非靜態資料成員沒有私有或保護屬性的、沒有引用型別的、沒有非pod類型別的(即巢狀類都必須是pod)、沒有指標到成員型別的(因為這個型別內含了this指標)。

#include #include 

using

namespace

std;

typedef

struct

test

test;

intmain()

程式會崩潰!

不能把乙個含有string型的物件memset,含有cstring物件也是如此。

c++裡結構就是類,而不是原生的c結構。用memset會把類裡的一些必要資料清零。另外需要注意如果類有虛函式,則就有虛表指標,用memset會把虛函式表指標置為0,這樣的類就不會有多型了。

幾道筆試題

出處 一 程式設計題 30分 現代的處理器提供了compare and swap原子操作 int compare and swap int pv,const int cv,const int nv 即比較 pv與cv,如果相等,則把 pv值替換為nv並返回 pv原值,否則返回 pv的值。請利用上述原...

幾道筆試題

1.在開啟的子視窗重新整理父視窗的 如何寫?window.opener.loaction.reload 2.寫出乙個ajax post請求伺服器資源並提公升返回資料的 片段,可以使用你熟悉的任何第三方js框架。ajax sucess function retval error function 3....

幾道典型的C 筆試題

幾道典型的c 筆試題 xianfa110 下面這個程式執行後會有什麼錯誤或者效果 define max 255 int main 解答 max 255 陣列a的下標範圍為 0.max 1,這是其一.其二.當i迴圈到255時,迴圈內執行 a 255 255 這句本身沒有問題.但是返回for i 0 i...