effective c++學習心得(一)

effective c++學習心得(一)

條款01

這一部分,主要講了使用c++進行編程,做者講c++稱爲語言聯邦,能夠有幾種形式,簡單的來講主要分爲:ios

1.相似c++使用**過程式**進行編程。
2.採用了**面向對象**的思想。
3.用於c++中提供了template這個特性,因此就出現了**泛型編程**。
4.另外一個則是歸功於STL的強大,它對容器,迭代器,算法,函數對象,各自都能很好的配合,性能也很不錯。

條款02

在傳統的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);
    }

關於const的介紹

一.使用const定義變量

int a = 1;
const int *p = &a; //const在*前面,表明指針解引用後的值不可改變
int * const p = &a; // const在* 後面表示指針指向的地址不可改變
const int * const p = &a; // 而這種狀況則表示指針指向的地址和解引用的值不可改變

二.在類中使用const關鍵字

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

簡單介紹一下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,思路比較雜亂,還有比較深層次的東西,因爲本身也是剛入門不久的小白,就不獻醜了,哪裏有錯和須要商榷的,歡迎補充。

相關文章
相關標籤/搜索