C++ 基礎面試題

C/C++

struct AA

{

int a;

char b;

};

 

struct student{

char name[10];

AA a;

short b;

};

int main(){

AA aa;

char name[10];

int a;

short b;

cout<<"AA:" <<sizeof(aa)<<endl;

cout<<"name:" <<sizeof(name)<<endl;

cout<< "a:"<<sizeof(a)<<endl;

cout<< "b:"<<sizeof(b)<<endl;

cout<< "student:"<<sizeof(student)<<endl;

}

在函數體內,一個被聲明爲靜態的變量在這一函數調用過程中維持不變。

全局變量和函數的一個共同點就是都具有外部鏈接屬性,即不僅可以在當前源文件中使用,在其他源文件中使用 extern 聲明後也可以使用

如果用static修飾後,它們的外部鏈接屬性就會變爲內部鏈接屬性,即只能在當前源文件中使用。

// const int *p 等價於 int const *p 修飾的是p指向的內容 p = xxx地址(正確) *p = xxx值(錯誤)

// int * const p 修飾的是p的本身 p = xxx地址(都是錯誤的) *p = xxx值(都是正確)

 

動態多態的條件:

●基類中必須包含虛函數,並且派生類中一定要對基類中的虛函數進行重寫。

●通過基類對象的指針或者引用調用虛函數。

1. 虛函數和純虛函數可以定義在同一個類(class)中,含有純虛函數的類被稱爲抽象類(abstract class),而只含有虛函數的類(class)不能被稱爲抽象類(abstract class)。

2. 虛函數可以被直接使用,也可以被子類(sub class)重載以後以多態的形式調用,而純虛函數必須在子類(sub class)中實現該函數纔可以使用,因爲純虛函數在基類(base class)只有聲明而沒有定義。

3. 虛函數和純虛函數都可以在子類(sub class)中被重載,以多態的形式被調用。

4. 虛函數和純虛函數通常存在於抽象基類(abstract base class -ABC)之中,被繼承的子類重載,目的是提供一個統一的接口。

5. 虛函數的定義形式:virtual {method body}

  純虛函數的定義形式:virtual { } = 0;

在虛函數和純虛函數的定義中不能有static標識符,原因很簡單,被static修飾的函數在編譯時候要求前期bind,然而虛函數卻是動態綁定(run-time bind),而且被兩者修飾的函數生命週期(life recycle)也不一樣。

10. 多態性指相同對象收到不同消息或不同對象收到相同消息時產生不同的實現動作。C++支持兩種多態性:編譯時多態性,運行時多態性。

a.編譯時多態性:通過重載函數實現

b 運行時多態性:通過虛函數實現。

11. 如果一個類中含有純虛函數,那麼任何試圖對該類進行實例化的語句都將導致錯誤的產生,因爲抽象基類(ABC)是不能被直接調用的。必須被子類繼承重載以後,根據要求調用其子類的方法。

 

C++

new和delete、new[ ]和delete[ ]一定要匹配使用,一定要匹配使用,一定要匹配使用!!!否則會出現內存泄漏甚至崩潰的問題

【new作用】

調用operator new 分配空間。

調用構造函數初始化對象。

【delete作用】

調用析構函數清理對象。

調用operator delete釋放空間。

string ---long int:

int main ()

{

string a = "1234567890";

long b = atoi(a.c_str());

cout<<b<<endl;

return 0;

}

 

string lint_str(long int i_str)

{

stringstream os;

os<<i_str;

string s ;

os>>s;

return s;

}

#include <iostream>

using namespace std;

 

void func(void* t)

{

cout << "func1" << endl;

}

 

void func(int i)

{

cout << "func2" << endl;

}

 

int main()

{

func(NULL);

func(nullptr);

return 0;

}

 

輸出:func1 、func2

NULL和nullptr都是代表空指針,但是NULL在重載函數的時候卻匹配到了參數爲int的那個版本。

其實NULL在C++中就是代表着0,這是因爲在C++中void* 類型是不允許隱式轉換成其他類型的,所以C++中用0來代表空指針,但是在重載整形的情況下,會出現上述的問題。所以,C++11加入了nullptr,可以保證在任何情況下都代表空指針,而不會出現上述的情況,因此,建議以後還是都用nullptr替代NULL吧。

delete 釋放new分配的單個對象指針指向的內存

delete[] 釋放new分配的對象數組指針指向的內存

在有虛函數的類的實例中這個表被分配在了這個實例的內存中,所以,當我們用父類的指針來操作一個子類的時候,這張虛函數表就顯得由爲重要了,它就像一個地圖一樣,指明瞭實際所應該調用的函數。

在實現多態時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。

 

一、結構體struct

    各成員各自擁有自己的內存,各自使用互不干涉,同時存在的,遵循內存對齊原則。一個struct變量的總長度等於所有成員的長度之和。

二、聯合體union

    各成員共用一塊內存空間,並且同時只有一個成員可以得到這塊內存的使用權(對該內存的讀寫),各變量共用一個內存首地址。

#include<stdio.h>

//聯合體

struct u4

{

int a;

char b;

short c;

}U5;

struct u5

{

char b;

int a;

short c;

}U6;

//主函數

int main(){

printf("%d\n",sizeof(U5));

printf("%d\n",sizeof(U6));

return 0;

}

//輸出爲

//8

//12

 

#include<stdio.h>

//聯合體

union u2

{

char a;

int b;

short c;

double d;

int e[5];

}U3;

//主函數

int main(){

printf("%d\n",sizeof(U3));//輸出24

return 0;

}

引用不可以爲空,但指針可以爲空,引用是對象的別名,引用爲空——對象都不存在,怎麼可能有別名.

故定義一個引用的時候,必須初始化。引用不可以改變指向;但是指針可以改變指向,而指向其它對象。雖然引用不可以改變指向,但是可以改變初始化對象的內容。

引用的大小是所指向的變量的大小,因爲引用只是一個別名而已;指針是指針本身的大小,4個字節。

當你寫這種代碼:

string *ps = new string("Memory Management");

你使用的new是new  operator。

new操作符做兩件事,分配內存+調用構造函數初始化。

 

operator new所瞭解的是內存分配,它對構造函數一無所知。

 

四種轉換:static_cast、dynamic_cast、const_cast和reinterpre_cast.

 

  • 4.27 函數重載

多個同名函數有不同的參數集

編譯器根據不同參數的類型和個數產生調用匹配

函數重載用於處理不同數據類型的類似任務

 

函數名稱必須相同。

參數列表必須不同(個數不同、類型不同、參數排列順序不同等)。

函數的返回類型可以相同也可以不相同。

僅僅返回類型不同不足以成爲函數的重載。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章