這一部分,主要講了使用c++進行編程,做者講c++稱爲語言聯邦,能夠有幾種形式,簡單的來講主要分爲:ios
1.相似c++使用**過程式**進行編程。 2.採用了**面向對象**的思想。 3.用於c++中提供了template這個特性,因此就出現了**泛型編程**。 4.另外一個則是歸功於STL的強大,它對容器,迭代器,算法,函數對象,各自都能很好的配合,性能也很不錯。
在傳統的c++語言中,對於定義常量,通常都是使用define關鍵字來進行定義的,在編譯器源程序時,
預編譯器會將代碼中出現有關用#define定義的常量和函數所有替換。
缺點:c++
例如:當咱們要進行調試程序時,由於編譯器已經將原有的常量的符號用一個數值來替代,這時
進行調試時,咱們只能看到數字,卻不能看到對應的符號,產生了極大的不便。除此以外,當你
,想對一個const取地址時,對於define定義的常量時取不了地址的,因此const在這裏又發揮
了做用。
算法
利用define語句咱們沒法建立一個類專屬常量,由於一旦一個宏被定義,他將存在於整個編譯單元,
或者更大的做用域範圍,他並不重視做用域的概念,不能提供很好的封裝性。編程
因此在c++中咱們有更好的解決方案,那就是使用const和enum來定義一個常量和一個枚舉型數據。對於一個常量型變量編譯器會將變量名稱記錄進符號表中。函數
注意:在c語言中定義的const常量能夠經過指針來改變,可是c++中是不可行, c++中不提倡改變常量的值,可是也有方法改變。 #include <stdio.h> int main(){ int a = 1; const int p = a; int *ptr = &p; *ptr = 2; printf("the p is %d\n", p); }
int a = 1; const int *p = &a; //const在*前面,表明指針解引用後的值不可改變 int * const p = &a; // const在* 後面表示指針指向的地址不可改變 const int * const p = &a; // 而這種狀況則表示指針指向的地址和解引用的值不可改變
1.常成員變量性能
class A{ public: A():a(1){} //const聲明的成員變量,必須使用初始化列表,來進行初始化 // const變量不可更改 void get(); private: const int a; };
2.常成員函數
常成員函數能夠區分函數重載,定義和實現常成員函數都要加const
常成員函數中,不能更新成員變量,不能調用很是成員函數。
2.常成員函數實現學習
public: A(int i, int j):a(i), b(j){} void get() const; private: const int a; int b; }; void A::get() const { b = 2; //錯誤,不能更新成員變量 cout << "the b+1 is " << b+1 << endl; // 這種只是打印數據,不算更新 }
3.常成員函數區分函數重載this
#include <iostream> using namespace std; class A{ public: A(int i, int j):a(i), b(j){} void get() const; void get(); private: const int a; int b; }; void A::get() const { cout << "this is a class " << endl; } void A::get(){ cout << "this is a const class " << endl; } int main(){ const A a(1,2); // 常對象,調用get()的常成員函數版本 A a1(1,2); // 通常對象,調用普通成員函數 a.get(); a1.get(); return 0; }
簡單介紹一下enum的使用方法:spa
enum {ONE, TWO}; //直接可使用ONE,TWO的值 enum W{ONE,TWO}a, b; //經過enum關鍵字聲明a,b兩個enum類型的值 a = ONE, b=TWO; //賦值操做 typedef enum W{ONE, TWO}w; //使用typedef爲enum W 起了個別名w w w1 = ONE; //使用w爲w1賦值,至關於 enum W w1 = ONE; w w2 = TWO; typedef enum {ONE, TWO}w; //能夠省略點W w w1 = ONE; w w2 = TWO;
首先咱們先看一下static修飾符的做用:
在類咱們使用的是靜態變量指針
#include <iostream> class Widget{ public: Widget(){} private: const static int i; // 這種是正確的 const static int i = 1; //這種是錯誤的 // 靜態類成員變量也稱類變量,他不屬於單個對象,而是被全部對象共享, //只初始化一次,而且在程序運行期間,內存中只有一份拷貝。還有一點要 //特別注意的是,類變量只能在類中聲明,在類外定義。 }; const int Widget::i = 1; // 類外聲明類變量 int main(){ Widget w; return 0; }
這時就引起了一個問題,若是我要在類被實例化成一個對象之間,調用靜態常量,因爲沒有初始化,並無本身想要的
初值,因此引起了一些沒必要要的麻煩,此時能夠藉助enum的幫助
#include <iostream> class Widget{ public: Widget(){} void get(){ // 在類中直接實現了函數,編譯器會考慮將它變成內聯函數。 std::cout << "the ONE is " << ONE << std::endl; } private: enum {ONE = 2}; //定義了一個枚舉類型的變量,在類成員函數中可使用這個常量值 };
int main(){ Widget w; return 0; }
只是簡單介紹了enum的做用,他的功能還有不少,若是想要了解更多,能夠自行百度enum。
簡單粗略地介紹了條款1 和2,思路比較雜亂,還有比較深層次的東西,因爲本身也是剛入門不久的小白,就不獻醜了,哪裏有錯和須要商榷的,歡迎補充。