日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

《C++程序设计原理与实践》读书笔记(二)

發布時間:2023/11/29 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《C++程序设计原理与实践》读书笔记(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? C++語言提供了一些內置的類型,如char、int和double。對于一個類型,如果編譯器無須借助程序員在源碼中提供的任何聲明,就知道如何表示這種類型的對象以及可以對它進行什么樣的運算,我們就稱這種類型是內置的。

? ? 非內置的類型稱為用戶自定義類型(user-defined type , UDT)。用戶自定義的類型包括每個ISO標準C++實現都提供給程序員的標準庫類型,如string,vector和ostream。


? ? 我們為什么要創建自定義類型呢?原因在于編譯器不知道我們想在程序中使用的所有類型。它也不可能知道,因為有用的類型實在太多了--沒有語言設計者或者編譯器開發者能預知所有類型。通過類型,我們可以在代碼中直接、有效地表達我們的思想。



? ? C++提供了兩類用戶自定義數據類型:類和枚舉。類是到目前為止最常用,也是最重要的概念描述機制,因此我們首先把注意力放在類上。類能夠在程序中直接地表達概念。一個類是一個(用戶自定義)類型是,它指出這種類型的對象如何表示,如何創建,如何使用,以及如何銷毀。在C++中(以及大多數現代程序設計語言中),類是構造大型程序的關鍵的基本組成部分,對小程序也同樣的非常有用。

? ? 一個類就是一個用戶自定義類型,由一些內置類型和其他用戶自定義類型的對象以及一些函數組成

。這些用來定義類的組成部分稱為成員(member)。一個類可以有0個或多個成員,例如:

class?X { public:int?m;?//data?memberint?mf(int?v)?{int?old?=?m;?m?=?v;?return?old;}??//成員函數 }

? ? 成員可以有許多種類別,大多數要么是數據成員,定義了類對象的表示方法,要么是函數成員,提供類對象之上的運算。類成員的訪問使用這種符號:對象.成員。

? ? 我們通常把一個類看做一個接口加上一個實現。接口是類聲明的一部分,用戶可以直接訪問它。實現是類聲明的另一部分,用戶只能通過接口間接訪問它。公共的接口用標號public:標識,實現用private:標識。你可以將一個類聲明理解為如下形式:

class?X {public:private: }

類成員默認是私有的,也就是說,如下代碼所示:

class?X {int?mf(int);//... };

等價于

class?X {private:int?mf(int);//?... };

因此,下面的代碼是錯誤的:

X?x; int?y?=?x.mf();

用戶不能直接訪問一個私有成員,應通過一個公有函數來訪問,例如:

class?X {int?m;int?mf(int);public:int?f(int?i)?{?m?=?i;?return?mf(i);} }; X?x; int?y?=?x.f(2);

我們用私有和公用之間的差別來描述接口(類的用戶視圖)和實現細節(類的實現者視圖)之間的重要區別

。C++提供了一種很有用的簡化的功能,可用來描述沒有私有實現細節的類。這種語法功能就是結構,一

個結構就是一個成員默認為公用屬性的類:

struct?X {int?m;//?... };

意味著

class?X {public:int?m;//?... };

結構主要用于成員可以取任意值的數據結構,即我們不能定義結構有意義的不變式。


與類同名的成員函數是特殊的成員函數,稱為構造函數(constructor),專門用于類對象的初始化("構造

")。如果一個類具有需要參數的構造函數,而程序員忘記利用它初始化類對象,則編譯器會捕獲這個錯

誤。C++提供了一種專用的,而且很方便的語法來進行這種初始化,例如:

struct?Date?{int?y,m,d;?Date(int?y,?int?m,?int?d);?void?add_day(int?n);}; Date?my_birthday;??//錯誤,沒有初始化成員。 Date?today(12,24,2007); //錯誤,運行時錯誤。 Date?last(2000,12,31); //正確。


運算符重載


你可以在類或枚舉對象上定義幾乎沒有C++運算符,這通常稱為運算符重載(operator overloading)。這

種機制用于為用戶自定義類型提供習慣的符號表示方法。

enum?Month?{Jan?=?1,Feb,?Mar,?Apr,?May,?Jun,?Jul,?Aug,?Sep,?Oct,?Nov,?Dec}; Month?operator++(Month&?m) {m?=?(m?==?Dec)?Jan:Month(m+1);return?m; }

其中?:是“算術if"運算符:當(m == Dec)時m的值變為Jan,否則m的值為Month(m+1)。這是十二月后"繞回"一月這一事實的一種非常簡潔的描述方法。我們可以像如下代碼一樣使用Month類型。

Month?m?=?Sep; ++m;??//m變為Oct ++m;??//m變為Nov ++m;??//m變為Dec ++m;??//m變為Jan


你可能覺得增加Month對象值這樣的操作沒那么常用,不至于設計一個專門的運算符。可能確實是這樣,

那么輸出運算符又如何呢?如下代碼定義了一個輸出運算符:

vector<string>?month_tbl;ostream&?operator<<(ostream&?os,?Month?m)?{?return?os?<<?month_tbl[m];}

  你可以為自己的類型重新定義幾乎沒有的C++運算符,如+、-、*、/、%、[]、()、^、!、&、<、<=

、>和>=等。但你不能定義新的運算符。

  一個重載的運算符必須作用于至少一個用戶自定義類型的運算對象:

int?operator+(int?,int);?//錯誤,不能重載內置運算符+ vector?operator+(const?vector&,?const?vector?&);?//OK vector?operator+=(const?vector&,?int);?//OK


? ? 一個一般性的原則是:除非你真正確定重載運算符能大大改善代碼,否則不要為你的類型定義運算符。而且,重載運算符應該保持其原有意義:+就應該是加法,二元運算符*就應該表示乘法,[]表示元素訪問,()表示調用,等等。這只是建議,并不是C++語言規則,但這是一個有益的建議:按習慣使用運算符,例如+只用做加法,對我們理解程序會有極大的幫助。畢竟,這種習慣用法源于人們千百年使用數學符號的經驗。相反,含混不清的運算符和常規不符的使用方式是混亂和錯誤之源。


類接口


? ? 類的公有接口和實現部分應該分離。但是,如何來設計一個好的接口呢?

? ?(1)保持接口的完整性。

? ?(2)保持接口的最小化。

? ?(3)提供構造函數。

? ?(4)支持(或禁止) 拷貝。

? ?(5)使用類型來提供完善的類型檢查。

? ?(6)支持不可修改的成員函數。

? ?(7)在析構函數中釋放所有的資源。

? ? 前兩條原則可以歸結為"保持接口盡可能小,但不要更小了“。我們希望接口盡量小,是因為小的接口易于學習和記,而實現者也不會為不必要的和很少使用的功能浪費大量時間。小的接口還意味著當錯誤發生時,我們中需要檢查很少的函數來定位錯誤。平均來看,公有成員函數越多,查找bug就越困難--調試帶公有數據的類是非常復雜的,不要讓陷入其中。當然,前提還是要保持完整性,否則,接口就沒有用處了。如果一個接口無法完成我們真正需要做的全部工作,我們是不會使用它的。


轉載于:https://blog.51cto.com/hthinker/1588473

總結

以上是生活随笔為你收集整理的《C++程序设计原理与实践》读书笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。