【第一章】
書店程序核心:
if 語句例子
#include <iostream>
int main()
{
int currVal = 0, val = 0;
if (std::cin >> currVal) {
int cnt = 1;
while (std::cin >> val) {
if (val == currVal)
++cnt;
else {
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
currVal = val;
cnt = 1;
}
}
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
}
return 0;
}
(書上的例子又有錯…無語…此程序只能顯示第一個出現的次數…還沒想怎麼改)
【第二章】
· 當知曉數值不可能爲負時,選用無符號類型
[引用]:
定義引用時,把引用和初始值綁定在一起,不是把初始值拷貝給引用,無法讓引用重新綁定到另一對象。引用只是爲已經存在的對象起另一個名字。
·引用必須初始化!初始值也必須是對象,而不是具體的數值。
[指針]:
寫法1:修飾符和變量標識符寫在一起 int *p1, *p2;
寫法2:修飾符和類型名寫在一起,每條語句只定義一個變量。 int* p1; int* p2;
·新標準下最好用nullptr初始化指針
void* 指針——存放任意對象的地址,缺點是不知道是什麼類型的指針,不能直接操作它所指向的對象。
·指向指針的引用
int i = 42; int *p; int *&r = p;//r爲引用。從右往左,離變量名最近的符號
[const]:
默認狀態下,const對象僅在文件內有效,所以想在多個文件之間共享const對象,必須在變量的定義前加 extern關鍵字
extern const int bufSize = fcn();
const的引用:允許爲一個const引用綁定非常量的對象、字面值
int i = 42;
const int &r1 = i;
const int &r2 = 42;
const int &r3 = r1 * 2;
int &r4 = r1 * 2;// 錯誤,r4是非常量引用
const 的引用 對於引用對象本身是不是常量未作限定,所以對象可由其他途徑被改變其值
int i = 42;
int &r1 = i;
const int &r2 = i;//不允許通過r2修改i的值
r1 = 0;//i的值被修改爲0
r2 = 0;//錯誤,r2是常量引用
const引用 可以引用一個非const的對象
指向常量的指針 可以指向非常量對象
常量指針: *const 必須初始化,則其值(指針中的地址)不能再改變,不變的是指針的值 不是指向的那個值
頂層const:指針本身是個常量[總結:初始化const 、const指針 、constexpr指針 是頂層const]
const int ci = 42;//頂層const
int i = 0;
int *const p1 = &i;//頂層const
constexpr int *p3 = &ci;//頂層const
底層const:指針所指對象是個常量[總結:const的引用 、指向const的指針 是底層const]
const int *p2 = &ci;//底層const
const int &r = ci;//底層const
·用constexpr來聲明一個常量表達式
·類型別名定義 typedef 新標準中使用 別名聲明using
typedef char *pstring;
const pstring cstr = 0;//指向char的常量指針
注: 不能將類型別名替換成原來樣子理解
const char *cstr = 0;//聲明瞭指向const char的指針
(auto decltype 略看了…)
·auto 類型說明符——讓編譯器替我們分析表達式所屬的類型,auto定義的變量必須有初始值
·decltype 類型指示符——另一種類型說明符,選擇並返回操作數的數據類型,不實際計算表達式的值
·預處理器中,頭文件保護符依賴於預處理變量,預處理變量兩種狀態:已定義 未定義
#define 把一個名字設定爲預處理變量
#ifdef 變量已定義爲真
#ifndef 變量未定義爲真。檢查結果爲真則執行後續操作直到遇見 #endif
有效的防治了重複包含的發生