讀primer c 補充筆記

2021-09-24 19:47:02 字數 4162 閱讀 9091

如果想在多個檔案之間共享const物件,必須在變數的定義之前新增extern關鍵字

指標的型別必須與其所指物件的型別一致,但允許令乙個指向常量的指標指向乙個非常量物件。

指標本身是乙個常量並不意味著不能通過指標修改其所指物件的值,完全取決於所指物件的型別

//1int errnumb = 0;

int *const curerr = &errnumb; //這時執行*curerr = 0;是正確的。

//2const double pi = 3.1415; //這是乙個頂層const,

const double *const pip = $pi; //這時執行*pip = 2.72;是錯誤的。靠右的是頂層,靠左的是底層,但是當賦值號右邊時數字是,是頂層const

頂層const表示自己本身的型別, 底層const表示所指物件的型別。如果所指物件為「數」,則為頂層const

如果你認定變數是乙個常量表示式,那就把它宣告成constexpr型別

typedef char *pstring;

const pstring cstr = 0; //const char* cstr = 0;

const pstring *ps;

auto, decltype的使用:

使用decltype(ci)  x = 0;   自動推導出ci的型別來給x命名;

如果decltype使用的表示式不是乙個變數,則decltype返回表示式結果對應的型別,只是推導出表示式型別,而不是直接計算表示式的結果。

int i = 42, *p = &i, &r = i;  //注:decltype((ariable))是引用,注意雙括號。

decltype(r + 0) b; //b是表示式r + 0運算結果對應的型別, int

decltype(*p) c; //錯誤,c是int& 型別, 必須初始化。

getline(cin,line);//把換行符也讀進來,但不寫入line字元中,只是消除緩衝區中的「\n"。

string中的size()函式返回型別,size_type

int *ip[4]與int  (*p)[4]的區別

int *ip[4];陣列長度為4,元素型別是整型指標

int (*p)[4];p 是乙個指標,指向長度為4的 陣列,陣列型別為int型。『

eg,int *(&array)[10] = ptrs; 首先array是乙個引用,引用的物件是乙個長度為10的陣列,元素型別是整形指標。

++運算子高於*, *p++先移動再 *, *(解引用)低於點運算子。

inline取決於編譯器

assert(expr)

形參與實參要用精準匹配。

指向函式的指標的使用:void ff(int *);呼叫方法:void (*pf3)(int *) = ff;型別和引數要匹配。

緊跟在引數列表後面的const表示this是乙個指向常量的指標,像這樣使用const的成員函式被稱為常量成員函式。

std::string sales_data::isbn(const sales_data *const this)
因為this是指向常量的指標,所以常量成員函式不能改變呼叫他的物件的內容,但是除了mutable宣告的變數之外。

sales_data& sales_data::combine(const sales_data &rhs)

total.combine(trains);

//內建的運算子把它的左側運算物件當成左值返回,因此為了與它保持一致,combine函式必須返回引用型別。

不能建立乙個const的建構函式,因為只用建構函式完成初始化過程,物件才能真正取得其」常量「屬性。

友元函式:可以訪問乙個類中的private資料成員,最好集中宣告友元。友元宣告對於使用者來說,可以把別的類中的函式作為另乙個類中的友元。

當帶有引數的建構函式時,如果此時還需要不帶引數的物件,一定要寫出預設的建構函式。

void solve const()//返回的是常量引用,不能改變該常量物件的值

類中成員初始化時,引數列表順序與初始化順序沒有關係,與類中宣告成員的順序相同。

class x//錯誤,因為先初始化的是i

};

assign的使用:將右邊運算物件中所有元素拷貝到左邊運算物件中。

/*

emplace_front, emplace, emplace_back

直接隱式構造物件

*/c.emplace_back("987", 25, 15.99); //正確

c.push_back("987", 25, 15.99); //錯誤,需要顯示生成物件,再放入c

獲取容器的首尾元素值 ,

*c.begin(), c.front()  //首

*(--c.end()), c.back()// 尾

//其中forward_list沒有

如果容器是vector或string,且儲存空間被重新分配,則指向容器的迭代器,指標和引用都會失效。[容器操作可能使迭代器失效]

const 變數必須初始化,但當是指標時,只需要指向一塊記憶體即可。

const int  i = 4; 因為4是常數,所以這裡的const頂層,代表自己的型別。

allocator與new的區別,記憶體的分配與構造

alloc.destroy(p) //釋放, alloc.deallocate(p,n);二者的區別

element

first_free

capelement---->first_free 時構造物件時自動分配的, first_free ---->cap 時construct自動分配的。

string s = "world";  //1

string t = s + "!"; //2

string h = "hi" + s; //3

/* 2和3呼叫的運算子過載時不一樣的。

2是呼叫的s.operator+("!");

3是呼叫的operator+("hi", s);

其中"hi"預設的型別時 const char* 型別

唯一的要求是至少有乙個運算子物件是類型別,並且兩個運算物件都能準確無語地轉換為string

*/

動態陣列不是陣列型別。typedef int arrt[41]; //arrt是int。

析構函式體自身並不直接銷毀物件,成員實在析構函式體之後隱含的析構階段中被銷毀的。二者不在乙個階段進行。

c++中,當我們使用基類的引用(或指標)呼叫乙個虛函式時將發生動態繫結。為題:繫結的是哪個物件。

1)從派生類向基類的型別轉換只對指標或引用有效。2)基類是無法轉換為派生類的。

派生類的成員和友元只能訪問派生類物件中的基類部分的受保護成員。

虛析構函式的使用:當刪除乙個指向派生類物件的基類指標時將產生未定義的行為。

shared_ptr與make_shared配合使用。

vector不支援push_front,但使用slist.insert(slist.begin(), "hello");將資料插入到第乙個元素之前。

構造stack(push_back, pop_back, back),使用除array和forward_list之外的任何容器來構造

構造queue(back, push_back, front, push_front) 構造與list, deque上, 不能基於vector

構造priovity_queue(front, push_back, pop_back),構造與vector,deque, 不能時list

#include int sum = accumulate(vec.cbegin(), vec.cend(), index);

//index的型別決定了函式使用哪個加法運算子

equal(vec.cbegin(), vec.cend(), r.cbegin());

//判斷兩個迭代器是否相等,r的長度大於vec

插入迭代器:back_iterator

Primer C 學習筆記 第二章

本書為primer c 中文第五版 初始化與賦值 初始化的含義是建立變數時賦予其乙個初始值 賦值的含義是把物件的當前值擦除,以乙個新值代替 物件在建立的時候最好初始化 宣告與定義 宣告使得名字為程式所知,乙個檔案如果想要使用別處定義的名字必須包含對那個名字的宣告,宣告規定了變數的型別和名字 定義負責...

Primer C 學習筆記 第三章

本書為primer c 中文第五版 命名空間的using宣告 using宣告的形式如下 using namespace name eg.int value std cin value using std cin cin value std cout標頭檔案中不宜包含using宣告,以防發生名字衝突 ...

Oracle補充筆記

1 約束 2 外連線 3 檢視 4 轉換函式 to char 將引數轉換為字串給我們看。to char 日期 表示日期的字串,格式 按照某種格式表示出來 to char hiredate,dd 03 to date 將字串解析為日期型別,為了新增表中date型別的字段的資料的,給不了日期型別 除了s...