C++程式設計知識快速複習(高階特性總結篇)(精華高效全面版)
接上篇,這篇主要對C++一些高階特性進行歸類總結。
1、函式過載、覆蓋和隱藏
相對於C函式而言,C++增加了過載、內聯、const和virtual四種機制,其中過載和內聯機制可用於全域性函式,也可用於類成員函式,const與virtual機制僅用於類的成員函式。
類成員函式被過載的特徵:
a.相同的範圍(在同一個類中);
b.函式名稱相同;
c.引數不同;
d.Virtual關鍵字可有可無;
覆蓋是派生類中函式覆蓋基類函式的特徵:
a.不同範圍(分別位於派生類和基類中);
b.函式名稱相同;
c.引數相同;
d.基類函式必須要有virtual關鍵字;
隱藏的特徵:
a.若派生類與基類函式同名,但引數不同,此時無論基類是否有virtual關鍵字,基類函式被隱藏;注意與過載區別。
b.若派生類與基類函式同名,引數也相同,但基類沒有virtual關鍵字,此時基類函式被隱藏;注意與覆蓋相區別。
2、類的三種基本函式
建構函式、解構函式和賦值函式是每個類最基本的函式。每個類只有一個解構函式和一個賦值函式,可以有多個建構函式。對於任意一個類,若未編寫各個函式,編譯器會預設產生四個函式,如下所示:
注意:拷貝建構函式是在物件被建立時呼叫,賦值函式只能被已經存在的物件呼叫。
3建構函式的初始化列表初始化列表位於函式引數表後,函式體前,故列表的初始化工作發生在函式體內程式碼之前。列表中各量的初始化順序與變數在類中定義的順序相同,與排列順序無關。初始化列表的使用規則如下:
a.若類存在繼承關係,派生類必須在初始化列表中呼叫基類的建構函式;
b.類的const常量只能在初始化列表中初始化,不能在函式體內賦值;
c.類的資料成員可以採用初始化列表和函式體賦值兩種方式。對於非內部資料型別成員物件應採用初始化列表方式,這樣效率更高;對於內部資料型別,兩種方式效率相同,但用賦值方式更清晰;
4、如何在派生類中實現類的基本函式
基類的建構函式、解構函式、賦值函式不能被派生類繼承,派生類實現基本函式的原則如下:
派生類的建構函式應在初始化列表中呼叫基類的建構函式;
基類與派生類的解構函式應為虛擬函式;
在編寫派生類的賦值函式時,要將基類的資料成員重新賦值,若基類的資料成員私有,可以呼叫基類的賦值函式;
當基類建構函式要傳遞引數才能初始化時,派生類必須顯式定義建構函式,為基類傳引數;
5、用const來提高函式的健壯性
const不僅定義常量,更大的作用是可以修飾函式的引數、返回值和函式的定義體。被修飾的東西受強制保護,可以預防意外的變動,能提高程式的健壯性。
const只能修飾輸入引數。若採用指標傳遞,可以起到保護指標的作用;若採用值傳遞(內部型別),將自動產生臨時變數用於複製該函式,故不用const;對於外部型別,可以用const類修飾引用的方式,高效傳遞;
const修飾函式的返回值。若返回值是const修飾的指標,則指標內容不能改變,返回值只能賦給加const修飾的同類型指標;若返回值是值傳遞,不用const;
const修飾成員函式。任何不修改資料成員的函式都應該宣告為const型別;
6、提升程式效率的規則
程式的時間效率是指執行速度,空間效率是指程式佔用的記憶體或外存狀況。全域性效率指從作業系統的角度考慮的效率;區域性效率指從模組或函式角度上考慮的效率。提高效率的規則如下:
應當在滿足正確性、可靠性、健壯性、可讀性等質量因素的前提下,設法提高效率;
提高程式的全域性效率為主,區域性效率為輔;
先優化資料結構和演算法,再處理程式程式碼;
不要追求緊湊的程式碼,因為這並不能產生高效的機器碼;
7、C++中的四種類型轉換
dynamic_cast(表示式):只用於物件、指標和引用,主要用於執行安全的向下轉型。當用於多型型別時,它允許任意的隱式型別轉換及相反的過程,但在反向轉型時會檢查操作是否有效,這種檢測在執行時進行,若檢測不是有效的物件指標,返回NULL;
static_cast(表示式):允許執行任意的隱式轉換和相反的動作。應用在類指標上,父類指標和子類指標可以相互轉換,轉換過程中不檢查。但是不能將const轉化為非const;
const_cast(表示式):用來強制設定物件的常量性或移除;
reinterpret_cast(表示式):可轉換一種型別的指標為其它型別的指標,也可以將指標轉換為其它型別。非相關型別間的轉換,不對操作內容進行檢查。
===================本篇完結,下篇待續======================
【本文首發於微信公眾號:實戰開發者。也可掃描下方二維碼關注公號,獲得更多技術福利】
相關推薦
C++程式設計知識快速複習(高階特性總結篇)(精華高效全面版)
接上篇,這篇主要對C++一些高階特性進行歸類總結。1、函式過載、覆蓋和隱藏相對於C函式而言,C++增加了過載、內聯、const和virtual四種機制,其中過載和內聯機制可用於全域性函式
Python(七)語法 高階特性 切片 | 迭代(迴圈)| 列表生成式 | 生成器 | 迭代器
切片 取一個list或tuple的部分元素是非常常見的操作 有一個list[0,1,2,3,4,5]如果我們要取前n個元素比如說3個數 一般做法是 >>> L=[] >>> n=3 >>> for i in range(n): .
C++程式設計學習筆記 複習/拾遺 7
組合與繼承 程式碼重用是面向物件最引人注目的功能之一: 可以通過建立新類來複用程式碼,而不必再重頭開始編寫。 可以使用別人已經開發並除錯好的類。 類的重用 在新類中使用其他類的物件。即新類由多種類的物件組成,這種方法稱為組合。 在現有類的基礎
C++程式設計學習筆記 複習/拾遺 6
多型性與過載 多型性是面向物件程式設計的重要特徵之一。多型是指一個名字有多種語義,或一個相同介面有多種實現;或是指發出同樣的訊息被不同型別的物件接受而導致完全不同的行為,即物件根據所接收到的訊息做出相應的操作。 訊息主要是指對類的成員函式的呼叫 不同的行為是指不同的實現
C++程式設計學習筆記 複習/拾遺 5
靜態與友元 封裝性:物件的狀態資訊隱藏在物件內部,不允許外部程式直接訪問物件內部資訊,而是通過該類所提供的方法來實現對內部資訊的操作與訪問。 類外如何訪問被封裝的成員(private 和 protected成員)? –通過物件名.公有成員函式
C++程式設計學習筆記 複習/拾遺 4
類和物件應用 基於專案的多檔案管理 將類的設計與類的使用分離 類定義與main函式(類測試) 不在一個檔案中。 將類的宣告和類的成員函式實現分離 類定義與成員函式定義 不在一個檔案中 優點: 便於分工合作 便於軟
C++程式設計學習筆記 複習/拾遺 3
拷貝建構函式與解構函式 字串函式 例4.1:類中資料成員是字串 #include <iostream> #include <cstring>//字串函式宣告所在的標頭檔案 using namespace std; class HelloWorld { pri
C++程式設計學習筆記 複習/拾遺 1
面向物件概述與c++輸入輸出 1 使用<iostream>時,由於C++的標準庫中所有識別符號都被定義於一個名為std的namespace中,因此其後必須帶上語句“using namespace std;”。 2 #include <iostr
C++程式設計學習筆記 複習/拾遺 2
建構函式與物件初始化 建構函式用於建立類物件,初始化其成員。 解構函式用於撤銷類物件。 物件的私有資料成員初始化 若物件定義時若未顯式初始化,與變數類似,全域性物件和靜態物件在定義時初值為0,區域性物件在定義時初值為不確定的值。一旦建立一個物件,物件通常都需要有一個有意義的初
JMS學習十一 ActiveMQ Consumer高階特性之獨有消費者(Exclusive Consumer)
一、簡介 Queue中的訊息是按照順序被分發到consumers的。然而,當你有多個consumers同時從相同的queue中提取訊息時, 你將失去這個保證。因為這些訊息是被多個執行緒併發的處理。有的時候,保證訊息按照順序處理是很重要的。 如,你可能不希望在插入訂單操作結束之前執行更新這
一步步學spark之一scala高階特性中Lower bounds(下界)與Upper bounds(上界),View bounds(檢視邊界)3.7
一步步學spark之一scala高階特性中Lower bounds(下界)與Upper bounds(上界),View bounds(檢視邊界) Upper bounds(上界):我們使用一個物件或者一個類必須是什麼型別的,也就是說必須是什麼型別或者什麼型別的子類。 表示語法 <:
42.Linux/Unix 系統程式設計手冊(下) -- 共享庫高階特性
1.動態載入庫 當一個可執行檔案開始執行之後,動態連結器會載入程式的動態依賴列表中的所有共享庫,但有時候需要延遲載入庫是比較有用的。 如只在需要的時候載入一個外掛。動態連結器的這項功能是通過一組 API 實現的。這組 API 被稱為 dlopen API。 d
Python 學習筆記(高階特性)
【關於切片】 #例如一個列表如下: L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] print('L=', L) #在沒有使用切片之前,取列表前三項的方法可能會是: _list = [] for i in range(3): _list.
Python之學習筆記(高階特性)
[TOC] 切片,迭代,列表表示式,生成器 高階特性 # -*- coding: utf-8 -*- from collections import Iterable L = [] n =
C++程式設計知識分享:靜態庫
這次分享的宗旨是——讓大家學會建立與使用靜態庫、動態庫,知道靜態庫與動態庫的區別,知道使用的時候如何選擇。這裡不深入介紹靜態庫、動態庫的底層格式,記憶體佈局等,有興趣的同學,推薦一本書《程式設計師的自我修養——連結、裝載與庫》。 什麼是庫 庫是寫好的現有的,成熟的,可以複用的程式碼。現實中每個程式都要依賴
C++程式設計知識分享:動態庫
動態庫 我們上一篇文章介紹了靜態庫,我們發現靜態庫,容易使用和理解,也達到了程式碼複用的目的,那為什麼還需要動態庫呢? 為什麼還需要動態庫? 為什麼需要動態庫,其實也是靜態庫的特點導致。 空間浪費是靜態庫的一個問題。 有興趣一起交流c/c++的小夥伴可以加群:941636044
C++基礎知識易錯點和易混淆總結匯總(不定時更新)
以下是我本人不定時更新的易錯點彙總,如需轉載,請註明出處。 1、對指標的引用 int a = 10; int *p = &a; //初始化指標p。 int* &pa = p; //這個是對指標p的引用、在我們使用pa的操作。相當於對p的操作 2、函
C++程式設計知識分享:指標與引用
引言 指標和引用形式上很好區別,但是他們似乎有相同的功能,都能夠直接引用物件,對其進行直接的操作。但是什麼時候使用指標?什麼時候使用引用呢?這兩者很容易混淆,在此我詳細介紹一下指標和引用,力爭將最真實的一面展現給大家。如果我噴得不夠好,希望嘴下留情、手下留命,還請指點一二;如果感覺還不錯,請大家鼓掌。 &
Python(4)高階特性 總結
Python中很多常見語法可以使程式更加簡潔易讀,這裡我們介紹5個例子:切片、迭代、列表生成器、生成器、迭代器 1.切片(slice) 切片用於取list tuple中部分元素,通過下標索引,只需標出想得到的第一個元素下標和最後一個元素 L[a:b] 從
C++程式設計學習筆記 複習/拾遺 8
繼承的應用 #include <iostream> using namespace std; class A { public: void f(int i) { cout<<i<<en