Basic C++

來源:互聯網
上載者:User

標籤:bug   thread   基本原則   資訊   new   val   bsp   要求   空間   

當我們定義一個類的時候,如果是一個空的類,編譯器預設提供了預設建構函式,拷貝建構函式,拷貝賦值函數,內斂解構函式。

如果派生出一個新的類繼承自空類,編譯器產生的是一樣的,不過在構造的時候會調用基類的建構函式。

已經寫過了部分類函數,編譯器會將剩下的函數給你預設產生。

如果有自己的建構函式,編譯器會產生其他建構函式,但是不會產生預設建構函式。

如果沒有在最後寫return 0,會在最後預設調用exit(0),因此不寫return 0也是可以的。

C++本身有異常,不一定是在最後進行返回的。

const 不變性的引入,multithread是密不可分的。最早是在c++中引入的

constexpr 在編譯器得到足夠多的資訊後,可以在編譯期將結果得到。

decltype和auto很類似,差別之一就是沒有進行賦值操作,用到的僅僅是類型本身呢。

如果運算式加上一個小括弧 ,類型就是該類型的引用,就需要引用初始化,否則就會報錯了。

auto也可以,不過要顯示的指定參考型別。

更多時候decltype是和auto一起使用的,auto放在前面,同時使用decltype尾後返回這種形式。

在進行dynamic_cast類型轉換的時候,如果是指標類型,轉換失敗,會拋出null,如果是參考型別會拋出異常。

class中的函數預設是inline,在外邊實現的時候也需要加上inline

(void*) 0 C語言中的define

static的用法

在檔案裡面用法

在檔案的全域範圍內可見的,是在程式編譯的時候記憶體空間都已經分配好了,

定義在函數裡面,相當於函數有一個狀態。

static在類和struct的用法 在類中static僅僅相當於是聲明,還需要在外部進行類的定義

這個時候才會分配記憶體空間才能找到這個變數。

static_assert 和 assert類似,不過就是在編譯器還沒有到串連的過程如果沒有滿足要求就報錯了。

assert實在啟動並執行過程才會發現問題,assert是一個宏,在debug和release下面的行為是不一樣的,在release下面會自動的進行忽略。

static_cast沒有任何的效能損失,告訴編譯器就是要這麼進行強制類型轉換。

thread_local c++11引入的關鍵字,方便多線程編程。

----------------------------------------------------------------------------------------------------------------

C++98 C++11

類的前置聲明, 是不完全類型,void 也是不完整類型,僅僅是類型的聲明。

前置聲明的好處,為什麼要用前置聲明。

作為基、 類成員、類成員所需要的東西,這些情況是不能省略掉的,

其他情況下比如說參數介面或者是函數傳回值,只需要知道是什麼就行了,也就是有聲明就足夠了。

類在編譯的過程最需要的就是類的大小了。

構造和析構

C語言為什麼不會有析構這樣的過程,之所以沒有析構是因為C語言的控制流程是明確的

但是C++的程式的控制過程中,可能因為拋出異常而打斷了這樣的過程,這個時候控制的資源就應該被釋放掉。

Java 的資源釋放是不明確的,可能在你最繁忙的時候系統會釋放資源,這個時候就卡頓了。還有就是程式中管理的資源不僅是記憶體,還有檔案控制代碼,已經串連等等。這些也都是需要進行手動進行管理的。

C++有解構函式,記憶體在什麼時候釋放對於程式員來講是明確的,無非有兩種情況,一種是類自動析構的時候,new出來的資源delete的時候會進行釋放。

C++中的3條基本原則

rule1 類成員中有指標類型的成員變數的時候,必須要寫一個解構函式來管理資源。不能使用編譯器預設的解構函式,預設的解構函式會預設的調用類成員的解構函式,同時如果這個類是從其他類派生過來的,就會調用其父類的解構函式。

rule 2 rule3: 如果類是可以拷貝的,需要寫出拷貝建構函式和拷貝賦值函數。如果沒有寫會自動產生一個,產生的這個會僅僅對類成員進行拷貝,預設的拷貝是值拷貝。

如果不需要C++98的做法是privete私人化,並且僅僅是函函數,這個實在啟動並執行時候才進行決策。

C++11中的做法是使用=delete關鍵字,這種情況會在編譯時間候進行決策。

什麼是左值什麼是右值?右值是不能取地址的,左值是可以取地址的,這個是最明顯的差別。

C++中之前會大量進行對象的拷貝工作,函數的傳入傳出會大量的調用拷貝建構函式。

這種情況下,編譯器是可以做最佳化的,稱為是optimize value。

右值引用,C++11中引入的新概念。C++中明確了返回左值或者是返回右值是能夠區分出來的。

既然是能夠區分出來的就可以利用它, 減少對應的拷貝就是一個很大的問題了。

std::move就是將一個左值變成一個右值。右值就相當於是一個臨時變數,臨時變數不能夠取引用,但是可以取const引用。函數參數為const引用的時候函數參數可以為左值,右值,臨時對象,const引用,都是可以的,簡直就是萬能的參數。

如果沒有寫移動建構函式,預設就是調用拷貝建構函式,因此右值引用相當於是一個臨時變數,而拷貝建構函式的參數允許接受一個臨時變數,因此預設會調用拷貝建構函式。

rule4 rule5:

在拷貝建構函式傳入一個右值,現在有能力區分傳入的是左值還是右值了,以前是沒有能力進行區分是左值還是右值的。

右值的拷貝建構函式要做哪些東西呢?

就是交換指標變數,同時將右值的指標變數變為NULL。

絕對不要在解構函式中拋出異常

編譯器產生的解構函式預設是inline的,並且產生的是noexcept的。並且不會做任何的東西,不會包含try catch類似的語句在裡面。自身析構結束之後還會調用成員函數的析構

38個部分

 

Basic C++

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.