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

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

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

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

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

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

原创 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, int month, int

原创 C++ 靜態成員

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

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

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

原创 C++ 類和對象

1、結構體的擴充在C語言中,我們都學過結構體,它是一種自定義的數據類型,在結構體中我們只能定義變量。C++語言對結構體進行了擴充,提供了一種更加安全有效的數據類型,它不僅可以在其中定義變量,還可以包含函數,這就是C++中的類。實列說明://

原创 C++析構函數

析構函數一、作用在對象的聲生命週期結束時,做一些清理工作,列如:釋放給對象分配的內存空間。二、定義~類名() { 函數體 }三、特點函數名和類名相同函數名前需要加上~沒有函數參數無返回值在一個類中只能有一個析構函數撤銷對象時,編譯器自動調

原创 C++拷貝構造函數

拷貝構造函數一、作用在建立一個新的對象時,用一個已經存在的對象去初始化這個新建立的對象。二、定義類名 (const 類名& 對象名) { 函數體 }舉例說明:class Date { public: Date(int year =