C++學習筆記(一)

學習一門編程語言,首先要熟悉它的類型系統。如果你連它存在哪些數據類型都不瞭解,還談什麼使用語言來編程呢。而且,大多數常用編程語言的類型基本是比較一致的。另外,一門編程語言,一般來說,是有一組保留的關鍵字,它們在程序中具有特殊的含義。我經過整理,把C++相關的數據類型及其部分保留關鍵字,及其基本修飾符,都列舉出來。當然,這些在實際編程實踐中,就會慢慢熟悉。

第一部分:數據類型

1、基本類型

C++語言中基本類型,如下表所示:

類型標識符

類型說明

長度
(字節)

範圍

備註

char 字符型 1 -128 ~ 127 -27 ~ (27 -1)
unsigned char 無符字符型 1 0 ~ 255 0 ~ (28 -1)
short int 短整型 2 -32768 ~ 32767 2-15 ~ (215 - 1)
unsigned short int 無符短整型 2 0 ~ 65535 0 ~ (216 - 1)
int 整型 4 -2147483648 ~ 2147483647 -231 ~ (231 - 1)
unsigned int 無符整型 4 0 ~ 4294967295 0 ~ (232-1)
float 實型(單精度) 4 1.18*10-38 ~ 3.40*1038 7位有效位
double 實型(雙精度) 8 2.23*10-308 ~ 1.79*10308 15位有效位
long double 實型(長雙精度) 10 3.37*10-4932 ~ 1.18*104932 19位有效位

2、布爾類型

布爾類型使用關鍵字bool來聲明布爾變量,它的取值爲true和false。

3、枚舉類型

枚舉類型定義了一組整型常量(const int),使用enum關鍵字定義。這組常量具有一個名字,你可以命名爲能夠理解的常量名稱,便於理解。而對於枚舉類型的每個成員,都是一個int型的值,而且是按照定義的順序以1遞增,即初始的枚舉成員可以指定初始值,之後的每個枚舉成員都依次加1。

4、字符串類型

C++中具有兩種定義字符串的風格,一個是來自C語言的char*指針類型,一個是C++的STL中的string類型。

5、指針類型

指針類型可以在任何非指針類型的基礎上,得到對應類型的指針類型,其實指針就是一個內存的地址,表示一個內存地址單元的數字。

6、數組類型

對任何一種類型,都對應着該類型的數組類型,在函數的返回值是數組的時候,記得要返回數組的指針,也就是數組中第一個元素的內存地址。

7、引用類型

引用類型是C++中特有的一種數據類型,它可以是某個對象的別名,通過這個別名就能夠引用到對象,從而間接地操作這個對象。

在定義引用類型的時候,必須知道所要引用的對象的類型和該對象確實真實地存在,這樣我們才能夠去引用它從而操作它。

引用類型,可以是任意類型加上取地址符號&,就構成了引用類型。

8、類類型

類類型一般包括類的聲明和類的定義。類的聲明,是指告訴編譯器,某個類型已經存在;而類的定義,就是一個類在運行時應該表現出來的行爲。C++提供的標準類庫STL,提供了大量有用的類供我們使用。在實際開發中,我們還可以根據實際情況,定義我們自己需要的類類型。

實例

下面,通過編寫一個例子,對上面C++的類型有個基本的瞭解。代碼如下所示:

#include <iostream>
#include <string>
using namespace std;

class person;

void test_bool();
void test_enum();
void test_reference();
void test_pointer();
void test_class();

int main() {
    test_bool();
    cout<<endl;
    test_enum();
    cout<<endl;
    test_reference();
    cout<<endl;
    test_pointer();
    cout<<endl;
    test_class();
    return 0;
}

void test_bool() {
    bool is_good = true;
    cout<<"is_good="<<is_good<<endl;
}

enum week {
    SUN=100, MON, TUS, WED, THU, FRI, STA
};

void test_enum() {
        week week_day = STA;
        cout<<"week_day="<<week_day<<endl;
}

void test_reference() {
        float price = 12.56;
        float& ref_price = price;
        cout<<"Before modifying reference:"<<endl;
        cout<<"price="<<price<<endl;
        cout<<"ref_price="<<ref_price<<endl;

        ref_price += 78.35;
        cout<<"After modifying reference:"<<endl;
        cout<<"price="<<price<<endl;
        cout<<"ref_price="<<ref_price<<endl;
}

void test_pointer() {
    int *ptr = NULL;
    int counter = 100;
    ptr = &counter;
    cout<<"Before *ptr++, counter="<<counter<<", *ptr="<<*ptr<<endl;
    *ptr++;
    cout<<"After *ptr++, counter="<<counter<<", *ptr="<<*ptr<<endl;
    ptr = &counter;
    cout<<"Before (*ptr)++, counter="<<counter<<", *ptr="<<*ptr<<endl;
    (*ptr)++;
    cout<<"After (*ptr)++, counter="<<counter<<", *ptr="<<*ptr<<endl;
}

class person {
    public:
        person(string& name, int age):name(name), age(age) {
        }
        string& get_name() {
            return name;
        }
        int get_age() {
            return age;
        }
    private:
            string &name;
            int age;
};

void test_class() {
    string name("James Halt");
    int age = 24;
    person *james = new person(name, age);
    cout<<"person->name="<<james->get_name()<<endl;
    cout<<"person->age="<<james->get_age()<<endl;
    delete james;
}

編譯運行:

[hadoop@localhost c++]$ g++ -Wall -o mynote01 mynote01.cpp 
[hadoop@localhost c++]$ ./mynote01

運行結果,輸出如下所示:

is_good=1

week_day=106

Before modifying reference:
price=12.56
ref_price=12.56
After modifying reference:
price=90.91
ref_price=90.91

Before *ptr++, counter=100, *ptr=100
After *ptr++, counter=100, *ptr=-1076961796
Before (*ptr)++, counter=100, *ptr=100
After (*ptr)++, counter=101, *ptr=101

person->name=James Halt
person->age=24

通過上面程序運行結果,可以看到:

(1)布爾類型中,true實際等於1,false等於0;

(2)枚舉類型,可以指定初始值,然後每個枚舉成員依次遞增1;

(3)引用類型,可以通過引用來修改引用類型變量所引用的變量值;

(4)通過指針可以修改指針指向的變量的值。

第二部分:C++保留關鍵字

C++保留的關鍵字,如下所示:

asm

auto

bad_cast

bad_typeid

bool

break

case

catch

char

class

const

const_cast

continue

default

delete

do

double

dynamic_cast

else

enum

except

explicit

extern

false

finally

float

for

friend

goto

if

inline

int

long

mutable

namespace

new

operator

private

protected

public

register

reinterpret_cast

return

short

signed

sizeof

static

static_cast

struct

switch

template

this

throw

true

try

type_info

typedef

typeid

typename

union

unsigned

using

virtual

void

volatile

while

   

簡單介紹幾個:

1、const修飾符

const是常量修飾符,可以修飾任何基本類型,表示該類型的常量,在計算過程中常量的值是不可以改變的。

2、volatile修飾符

volatile修飾符也可以修飾任何基本類型,通常是爲了告訴所使用的編譯器,可能在編譯器控制或者監測環境之外發生改變。

3、typedef關鍵字

用於重新定義一個類型的,通常將已經存在的類型重新定義爲具有含義的類型標識符。

4、template關鍵字

C++定義模板的時候,使用template關鍵來定義。

5、using與namespace關鍵字

定義或者聲明命名空間的時候使用using namespace關鍵字。

6、inline關鍵字

在生命內聯函數的時候使用inline關鍵字。inline 內聯函數給出了一種解決方案:若一個函數被指定爲inline 函數則它將在程序中每個調用點上被內聯地展開。inline 機制用來優化小的只有幾行的經常被調用的函數。

7、new與delete關鍵字

在堆上創建對象,也就是與整個應用程序的聲明週期相同,除非顯式地使用delete關鍵字釋放堆上分配的內存,而且必須顯式地使用delete來回收,否則會造成內存泄露。

8、operator關鍵字

操作符重載,使用operator關鍵字來重載定義。

9、typename關鍵字

typename是用來定義泛型,聲明模板的類型的。

我們直接來看這些保留關鍵字,可能感覺非常枯燥,而且幾乎不可能真正理解它們到底是做什麼用的。那麼,只有通過多多實踐,來逐漸地瞭解並熟悉C++語言的特性,這應該是一種鞏固C++編程基礎的合理途徑。

第三部分:編譯運行C++程序

在Linux系統下,知道如何編譯和運行C++程序,這是最基礎的。在Linux下使用vim編輯器,例如,要在mycpp01.cpp文件中輸入C++源代碼,可以直接使用vim編輯器:

vi mynote01.cpp
然後,編寫C++程序。編寫完成後,保存源文件,然後進行編譯:

g++ -Wall -o mynote01 mynote01.cpp
這時,如果存在警告或者錯誤信息,就會打印出來,便於定位問題並進行修正。如果程序沒有問題,則會生成可執行文件mynote01,能夠運行你編寫的程序。運行C++程序,執行如下命令:

./mynote01

這樣,就能夠按照我們編寫的C++程序的邏輯去執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章