C plus6th 第4章 復合型別

2021-10-22 18:22:43 字數 4935 閱讀 2572

//第一種方法:

int year;

cin >> year;

cin.get(); //or cin.get(ch);

char name[10];

cin.getline(name,10);

//第二種方法:

int year;

(cin >> year).get(); //or (cin >> year).get(ch);

char name[10];

cin.getline(name,10);

string類:可以簡單將string作為一種定義字串資料型別變數的方法,不同於陣列字串的是,我們事先無需確定其占有空間的大小,程式將結合其內容動態調整。要使用string類,必須包含標頭檔案string,且使用using namespace std語句,或者使用全稱std::string來引用它。用string定義的字串變數可直接通過cin和cout實現賦值和列印。

wchar_t、char16_t、char32_t字元型別

以上寬字元型別,分別冠以l、u、u字首,後兩種為c++11新增的,其使用如下:

wchar_t title = l"chief astrogator";

char16_t name = u"felonia ripova";

char32_t name = u"humber super";

c++11還支援unicode字元編碼方案utf-8。使用u8字首來表示該型別字串字面值。

c++還支援原始字串(raw)。原始字串表示的就是自己,例如\n不再表示換行符,而是\和n本身。因此,原始字串以r作為字首,且使用 「( 和 )「 表示字串的起始和終止符。例如:

cout << r"(jim "king" uses "\n" instead of endl.)" << '\n'
上述**將輸出:jim "king" uses "\n" instead of endl.

而如果使用標準字串字面值,將需要如下編碼:

cout << "jim \"king\" uses \"\\n\" instead of endl." << '\n'
如果在原始字串中需要輸入「( 和 )」時又該如何表達呢?此時你可以自定義定界符,只要滿足「(或)」之間加入任意數量的除空格、左右括號、斜槓和製表符、換行符等控制字元之外的基本字元即可。例如「+-(和)+-」

在鍵盤上輸入原始字串時,按下回車鍵不僅會移到下一行,而且還會在原始字串中新增回車字元。

可將字首r與其它字串字首結合使用,例如ru、ur等。

struct inflatable   //結構體宣告

;struct inflatable goose; //c風格,struct必須包含

balls goose; //c++風格,struct可省略

結構中的位欄位

與c一樣,欄位的型別應為整型或列舉,接下來是欄位名(可選)和冒號,後面跟字段的位數,一般用以表示某暫存器結構。

struct torgle_register

;torgle_register tr = ;

共同體一般用於物件可能是多種資料型別的情況,可以大大節省儲存空間。例如商品id既可能是數字也可能是字串:

struct widget

id_val;

};...

widget prize;

...if (prize.type == 1)

cin >> prize.id_val.id_num;

else

cin >> prize.id_val.id_char;

當然,也可以使用匿名共同體,此時上述程式可以改寫為:

struct widget;};

...widget prize;

...if (prize.type == 1)

cin >> prize.id_num;

else

cin >> prize.id_char;

由於匿名,id_num和id_char被視為prize的兩個成員,因為他們的位址相同,所以不需要使用中間識別符號id_val。程式猿負責確定當前哪個成員是活動的。

enum提供了另一種建立符號常量的方式,這種方式可以代替const。其句法如下:

enum spectrum ;
以上定義讓spectrum成為新的型別名稱,其定義的變數只允許賦大括號的值(red, orange等),預設情況下,依次賦值0,1,2…給red, orange等。當然,也可以顯示的指定整數值來覆蓋預設值。

列舉變數僅定義了賦值運算,其它運算子對其非法。

列舉變數是整型,可被提公升賦值給int變數,但反過來結果未知。但如果int變數的值在列舉值範圍內,則也是可以的,如定義了乙個spectrum列舉變數band,如下句子合法:band = spectrum(3);

如果只使用列舉常量,而不建立列舉型別的變數,則可以省略列舉型別名稱。

//預設依次從0增加,後者的值比前者的值加1.若前者顯示賦值,則後者在前值基礎上加1

enum bits ;

//zero = null =0; one = numero_uno = 1,two = 2.

c++通過強制型別轉換,可以將在列舉變數取值範圍內的整數合法的賦給列舉變數。這個範圍是:上限是列舉變數最大值向上取2的冪整減去1,下限是0或者負數的向下取2的冪整加1.

enum bits ; //rang=[0, 15]

enum aha ; //rang=[-7, 127]

aha value;

value = aha(120); //合法

所以,只要賦給bits型別列舉變數的整數值在[0,15]範圍內都是合法的,賦給aha型別列舉變數的整數值在[-7,127]範圍內都是合法的.

每個列舉變數占用儲存空間大小由編譯器決定,早期c++,只能將int型賦給列舉變數,但新版本可以使用long,甚至long long型的值。所以其取值範圍小的可以用單位元組,取值範圍大的可以用4位元組。

int *ptr_a; //c style

int* ptr_a; //c++ style

int* ptr_a, ptr_b; //ptr_a是指標,但ptr_b是int變數!!!

int *ptr_a, *ptr_b; //此時二者均為指標!

long *fellow;       //定義了乙個位址,但未賦初值。

*fellow = 22334; //將22334存貯在乙個未知位址,極其危險!!!

int *ptr;

ptr = (int *)0xb8000000;

int *ps = new int;

...delete ps; //釋放ps指向的空間到記憶體池中,但ps指標變數不會被刪除,可以重新指向另乙個位址。

int *ps = new int;

int *pq = ps;

delete pq; //僅需要釋放一次,不需要再釋放ps了。

int *psome = new int[10];//分配含10個int元素的陣列,並返回陣列首位址

int *pone = new int;

。。。delete psome; //釋放動態陣列

delete pone; //非法!!!

delete null; //合法。

int * ps = new int[3];

int pa[3];

...size_ps = sizeof(ps); //得到的是位址大小4,假設位址變數占用4個位元組空間

size_pa = sizeof(pa); //得到陣列大小3*4=12,假設int變數占用4個位元組空間

int * ps = new int[3];

ps[0] = 0; //or *ps = 0;

ps[1] = 1; //等價於 *(ps+1) = 1;

ps[2] = 2;

cout << ps[0] << endl; //輸出0

cout << ps[0] << endl; //輸出1

ps -= 1;

delete ps;

#include ...

using namespace std;

vectorvi; //建立0長度的整型陣列vi

int n;

cin >> n;

vectorvd(n); //根據使用者輸入建立乙個長度為n的雙實型陣列

如果想建立長度固定的陣列,且操作比陣列方便,那就選擇array。它與陣列一樣,使用棧空間,其效率同陣列,但更方便和安全。建立array,需要包含標頭檔案array。

#include ...

using namespace std;

arrayai; //建立包含5個元素的整型陣列ai

arrayad = ; //建立包含4個元素的double型陣列di

為了錯誤引用陣列界外的元素,可使用array類的成員函式at(index),它會檢查提供的索引值index是否在陣列界內。

C plus6th 第6章 分支和邏輯運算子

int num while cin num 當輸入的是非數字時,cin返回false 字元函式 使用檔案輸出的主要步驟 雖然標頭檔案iostream提供了乙個預先定義好的名為cout的ostream物件,但我們在操作檔案時必須宣告自己的ofstream物件,並為其命名,將其同檔案關聯起來。此後便可以...

第4章 復合型別

第 4 章 復合型別 一 陣列 潛規則 只有在定義陣列時才能使用初始化。不能將乙個陣列賦給另乙個陣列。如果初始化為,則表示第乙個元素被設定為1,其他元素被設定為0。二 字串 注意要點 在確定儲存字串所需的最短陣列時,記得將結尾的空字元計算在內。如果要顯示部分字串,只需將需要的字串的結尾標記為 0 每...

C primer plus 第4章 復合型別

1.陣列初始化 2.字串 兩種方式 c 風格字串 以 0結尾 string類庫 單引號表示字元常量 a 是字串編碼的簡寫,char a a 是正確的。但是 a 表示的是兩個字元a和 0組成的字串,實際上 a 表示的是字串所在的記憶體位址,因此char a a 是非法的 1 cin.getline a...