原创 基類與派生類對象之間的賦值問題

一、將派生類對象賦值給基類對象? 注意:這不同於將派生類對象賦值給基類的引用或者指針 請看如下代碼: Base b; //基類對象 Derived d; //派生類對象 b=d;

原创 在繼承體系中使用new要注意哪些?

一、派生類中不使用new 在派生類中不使用new意味着,派生類中新增加的成員沒有指針類型的成員。 (1)派生類中是否需要顯式的定義析構函數? 不需要。因爲在派生類中沒有指針成員,所以在派生類對象生命週期結束時,使用默認的派生類的析

原创 C++ 轉換構造函數和轉換函數

一、轉換構造函數 (1)轉換構造函數的作用 作用:將某種類型轉換爲類類型 例如有下面的代碼: Base(int a); //轉換構造函數 Base b; //對象 b=12; 解析

原创 C++ auto關鍵字和基於範圍的for循環

1、auto的概念 在C++11中,auto不再是一個存儲類型指示符,而是作爲一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。 2、auto的使用 實列說明: int main() { int

原创 考慮異常安全的賦值運算符

一、賦值運算符需要考慮的因素 一個賦值運算符需要考慮的因素,有以下四點: 1. 檢查返回值類型是否是該類類型的引用,並且返回值也是自身引用(即*this)。 如果返回類型是一個void,那麼就不能進行連續賦值(s1=s2=s3)

原创 C++ shared_ptr的線程安全問題

shared_ptr的線程安全問題 首先看看下面的圖,這個圖描述的就是對象、資源、引用計數之間的關係。 shared_ptr的線程安全問題需要從兩個角度來分析: (1)從引用計數的角度來看: 雖然引用計數存在於每一個shared

原创 C++ shared_ptr的模擬實現

一、 shared_ptr的模擬實現 我在之前的博客《智能指針》中有說過shared_ptr的原理,那麼這篇博客,我們模擬實現一個shared_ptr,讓大家能更好的理解它的原理。 include<mutex> //這個頭文

原创 C++ unique_ptr的模擬實現

一、unique_ptr的模擬實現 在之前的博客中,我說過auto_ptr的缺陷,所以爲了避免auto_ptr的缺陷,所以unique_ptr用了一個簡單粗暴的辦法:防拷貝、防賦值。既然auto_ptr在拷貝和賦值的時候,會出現一

原创 C++ auto_ptr的簡單模擬實現

一、auto_ptr的簡單模擬實現 關於auto_ptr的缺陷我在之前的博客中就已經說明。在這篇博客中我們從它的底層來更進一步闡述。 在學習中,對某一個類進行簡單的模擬,一般情況下,我們只需要模擬實現四個函數,分別是:構造函數、析

原创 C++ 不在構造函數和析構函數中調用虛函數

首先在構造函數或者是在析構函數中是可以調用虛函數的。但是我們最好不要這樣做。 一、不在構造函數中調用虛函數 當我們在構造函數中調用虛函數時,一定調用的是基類的虛函數,即使此時你定義的是一個派生類的對象。 原因一: 在創建派生類對象

原创 C++ 多態的原理

什麼是多態? 所謂的多態說簡單來講就是不同的對象去完成相同的工作時,會產生不同的狀態。 多態分爲兩種:一種是編譯時的多態(靜態多態),另一種是運行時的多態(動態多態)。 編譯時的多態 編譯時的多態的實現與靜態連編有關。 (1)那麼

原创 C++菱形繼承與虛擬繼承

C++的繼承中有一種複雜的繼承方式,這就是菱形繼承。 菱形繼承 (1)什麼是菱形繼承? 假設現在有四個類,分別是A、B、C、D四個類。如果B類和C類同時繼承於A類,並且D類又同時繼承於B類和C類,那麼這四個類之間的關係就叫做菱形繼

原创 C++ 構造函數

構造函數 一、作用 主要用來完成對象的初始化工作。 二、定義及使用 構造函數的定義: 類名(參數表) { 函數體 } 舉例說明: class Date { public: //構造函數 Date(int year, in

原创 C++ 靜態成員

C++中的靜態成員包括靜態數據成員和靜態成員函數。 靜態數據成員 一、介紹及作用 在一個類中,如果在一個數據成員前冠以關鍵字static,那麼這種數據成員就叫做靜態數據成員。與一般的數據成員不同,無論建立多少個類的對象,都只有一份

原创 C++ 淺拷貝和深拷貝

淺拷貝 所謂的淺拷貝就是調用默認的拷貝構造函數按照字節序對數據成員逐一賦值。 舉例說明: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> us