C++基礎之常見問題

C++基礎之常見問題

const相關問題

C++ 成員函數後面接 const

給隱含的this指針加const,表示這個this指向的東西是const的,也就是說這個函數中無法改動數據成員了,相當於只讀操作

指向const對象的指針

形如 const double pi = 3.14;const double *cptr = π

指向const對象的指針 ***不允許修改所指的對象的值***
指向const對象的指針 強制要求也是const 例如 const double *cptr;
允許把非const對象的地址賦值給 指向const對象的指針

const指針

形如 int errNumb = 0;
int *const curErr = &errNumb;

const指針 一經定義不能再指向其他對象 ***可修改所指對象的值,取決於對象類型***

指向const對象的const指針

形如 const double PI =3.1415926;
const double *const pi_ptr = Π

指針既不可修改所指對象的值,也不可指向其他對象

指針和typedef

成員函數後面接:a(aa)

  冒號後面跟的是賦值,這種寫法是C++的特性。
  A( int aa, int bb ):a(aa),b(bb)
  aa賦給a bb賦給b

公有繼承 保護繼承 私有繼承

  派生類 公有繼承 基類  基類的所有控制訪問保持不變
             保護繼承           基類的公有繼承變爲保護繼承
             私有繼承           基類的訪問變爲私有訪問

純虛函數 形如virtual void a = 0;派生類纔可以重寫

this 只能在非靜態成員函數或非靜態數據成員初始值設定項的內部引用 this只能用在類申明文件裏面 不能實現和申明分開

基類的友元對從該基類派生的類型沒有特殊訪問權限,同樣如果基類和派生類都需要訪問另一個類,那麼類必須特地將訪問權限授予基類和每一個派生類

模板編寫 頭文件 要include 具體實現.cpp文件

使用new和不使用創建對象的區別

    //普通創建對象 創建之時就自動分配內存 然後自動銷燬 棧中分配
	tQueue<int> t1;
    t1.enqueue(1);
	int out = t1.dequeue();
	cout << out << endl;

    //new創建對象 手動分配內存 手動銷燬 不然內存泄露  堆中分配
	tQueue<int> *ptr = new tQueue<int>();
	ptr->enqueue(2);
	int out2=ptr->dequeue();
	cout << out2 << endl;
	delete ptr;

cout不能使用string 需要將string轉char * 解決辦法:string.c_str()

template與template

     1.template<typename T>與template<class T>一般情況下這兩個通用,但有一個特例,就是當 T 是一個類,而這個類又有子類(假設名爲 innerClass) 時,應      該用 template<typename>:
     2.typename T::innerClass myInnerObject;這裏的 typename 告訴編譯器,T::innerClass 是一個類,程序要聲明一個 T::innerClass 類的對象,而不是聲明 T 的靜態成員,而 typename 如果換成 class 則語法錯誤。

模板的特化

     函數的特化 template<>
     類的特化 成員函數不需要template
     特化成員而不特化類
     類模板的部分特化

泛型和模板的區別

    1.泛型的具體類型的確定是在程序運行時,而模板的實例化是在編譯時確定的;
    2.泛型無特化(自定義實現特定類型的處理),模板特化可以針對特定類型處理;
    3.泛型無部分特化,模板有;
    4.模板支持模板類型的形參,雖然一般不那樣做,泛型不可以。

模板是泛型的基礎,泛型是對模板的推廣。

強制類型轉化

C++ 引入了四種功能不同的強制類型轉換運算符以進行強制類型轉換:static_cast、reinterpret_cast、const_cast 和 dynamic_cast

static_cast

static_cast 用於進行比較“自然”和低風險的轉換,如整型和浮點型、字符型之間的互相轉換。另外,如果對象所屬的類重載了強制類型轉換運算符 T(如 T 是 int、int* 或其他類型名),則 static_cast 也能用來進行對象到 T 類型的轉換。
static_cast 不能用於在不同類型的指針之間互相轉換,也不能用於整型和指針之間的互相轉換,當然也不能用於不同類型的引用之間的轉換。因爲這些屬於風險比較高的轉換。

reinterpret_cast

用於進行各種不同類型的指針之間、不同類型的引用之間以及指針和能容納指針的整數類型之間的轉換。轉換時,執行的是逐個 比特複製 的操作。

這種轉換提供了很強的靈活性,但轉換的安全性只能由程序員的細心來保證了。例如,程序員執意要把一個 int* 指針、函數指針或其他類型的指針轉換成 string* 類型的指針也是可以的,至於以後用轉換後的指針調用 string 類的成員函數引發錯誤,程序員也只能自行承擔查找錯誤的煩瑣工作:(C++ 標準不允許將函數指針轉換成對象指針,但有些編譯器,如 Visual Studio 2010,則支持這種轉換)

const_cast

const_cast 運算符僅用於進行去除 const 屬性的轉換,它也是四個強制類型轉換運算符中唯一能夠去除 const 屬性的運算符。
將 const 引用轉換爲同類型的非 const 引用,將 const 指針轉換爲同類型的非 const 指針時可以使用 const_cast 運算符。

dynamic_cast

用 reinterpret_cast 可以將多態基類(包含虛函數的基類)的指針強制轉換爲派生類的指針,但是這種轉換不檢查安全性,即不檢查轉換後的指針是否確實指向一個派生類對象。dynamic_cast 專門用於將多態基類的指針或引用強制轉換爲派生類的指針或引用,而且能夠檢查轉換的安全性。對於不安全的指針轉換,轉換結果返回 NULL 指針。

dynamic_cast 是通過“運行時類型檢查”來保證安全性的。dynamic_cast 不能用於將非多態基類的指針或引用強制轉換爲派生類的指針或引用——這種轉換沒法保證安全性,只好用 reinterpret_cast 來完成。

虛繼承

智能指針 解決對象需要手動delete問題 將對象託管給 shared_ptr

       形如 shared_ptr<A> sp1(new A(2));

複製控制

野指針和內存泄露

malloc/free new/delete的區別

include ""和<>區別

仿函數

實現c++中string類 複製構造函數 賦值 複製 析構函數

入口函數 main wmain tmain

    void main(int argc, char **argv) 

argc 表示傳參數個數 argv 命令行執行傳入的參數 argv[0] 默認是exe路徑 a[1-argc] 真正傳參

  int wmain(int argc, wchar_t** argv)

同理 只不過argv類型是寬字符

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