結(jié)識更多同行,共同討論“嵌入式”技術(shù)。歡迎添加社區(qū)客服微信,備注發(fā)送“電源+公司名(學(xué)校)+職位(專業(yè))”拉您入群。
目錄
C/C++
STL
數(shù)據(jù)結(jié)構(gòu)
算法
Problems
操作系統(tǒng)
計(jì)算機(jī)網(wǎng)絡(luò)
網(wǎng)絡(luò)編程
數(shù)據(jù)庫
設(shè)計(jì)模式
鏈接裝載庫
海量數(shù)據(jù)處理
音視頻
其他
C/C++
const
作用
修飾變量,說明該變量不可以被改變;
修飾指針,分為指向常量的指針和指針常量;
常量引用,經(jīng)常用于形參類型,即避免了拷貝,又避免了函數(shù)對值的修改;
修飾成員函數(shù),說明該成員函數(shù)內(nèi)不能修改成員變量。
使用
// 類
class A
{
private:
const int a; // 常對象成員,只能在初始化列表賦值
public:
// 構(gòu)造函數(shù)
A() { };
A(int x) : a(x) { }; // 初始化列表
// const可用于對重載函數(shù)的區(qū)分
int getValue(); // 普通成員函數(shù)
int getValue() const; // 常成員函數(shù),不得修改類中的任何數(shù)據(jù)成員的值
};
void function()
{
// 對象
A b; // 普通對象,可以調(diào)用全部成員函數(shù)
const A a; // 常對象,只能調(diào)用常成員函數(shù)、更新常成員變量
const A *p = &a; // 常指針
const A &q = a; // 常引用
// 指針
char greeting[] = 'Hello';
char* p1 = greeting; // 指針變量,指向字符數(shù)組變量
const char* p2 = greeting; // 指針變量,指向字符數(shù)組常量
char* const p3 = greeting; // 常指針,指向字符數(shù)組變量
const char* const p4 = greeting; // 常指針,指向字符數(shù)組常量
}
// 函數(shù)
void function1(const int Var); // 傳遞過來的參數(shù)在函數(shù)內(nèi)不可變
void function2(const char* Var); // 參數(shù)指針?biāo)竷?nèi)容為常量
void function3(char* const Var); // 參數(shù)指針為常指針
void function4(const int& Var); // 引用參數(shù)在函數(shù)內(nèi)為常量
// 函數(shù)返回值
const int function5(); // 返回一個(gè)常數(shù)
const int* function6(); // 返回一個(gè)指向常量的指針變量,使用:const int *p = function6();
int* const function7(); // 返回一個(gè)指向變量的常指針,使用:int* const p = function7();
static
作用
修飾普通變量,修改變量的存儲(chǔ)區(qū)域和生命周期,使變量存儲(chǔ)在靜態(tài)區(qū),在 main 函數(shù)運(yùn)行前就分配了空間,如果有初始值就用初始值初始化它,如果沒有初始值系統(tǒng)用默認(rèn)值初始化它。
修飾普通函數(shù),表明函數(shù)的作用范圍,僅在定義該函數(shù)的文件內(nèi)才能使用。在多人開發(fā)項(xiàng)目時(shí),為了防止與他人命令函數(shù)重名,可以將函數(shù)定位為 static。
修飾成員變量,修飾成員變量使所有的對象只保存一個(gè)該變量,而且不需要生成對象就可以訪問該成員。
修飾成員函數(shù),修飾成員函數(shù)使得不需要生成對象就可以訪問該函數(shù),但是在 static 函數(shù)內(nèi)不能訪問非靜態(tài)成員。
this 指針
this 指針是一個(gè)隱含于每一個(gè)非靜態(tài)成員函數(shù)中的特殊指針。它指向正在被該成員函數(shù)操作的那個(gè)對象。
當(dāng)對一個(gè)對象調(diào)用成員函數(shù)時(shí),編譯程序先將對象的地址賦給 this 指針,然后調(diào)用成員函數(shù),每次成員函數(shù)存取數(shù)據(jù)成員時(shí),由隱含使用 this 指針。
當(dāng)一個(gè)成員函數(shù)被調(diào)用時(shí),自動(dòng)向它傳遞一個(gè)隱含的參數(shù),該參數(shù)是一個(gè)指向這個(gè)成員函數(shù)所在的對象的指針。
this 指針被隱含地聲明為: ClassName const this`,這意味著不能給 `this` 指針賦值;在 `ClassName` 類的 `const` 成員函數(shù)中,`this` 指針的類型為:`const ClassName const,這說明不能對 this 指針?biāo)赶虻倪@種對象是不可修改的(即不能對這種對象的數(shù)據(jù)成員進(jìn)行賦值操作);
this 并不是一個(gè)常規(guī)變量,而是個(gè)右值,所以不能取得 this 的地址(不能 &this)。
在以下場景中,經(jīng)常需要顯式引用 this 指針:
為實(shí)現(xiàn)對象的鏈?zhǔn)揭茫?div style="height:15px;">
為避免對同一對象進(jìn)行賦值操作;
在實(shí)現(xiàn)一些數(shù)據(jù)結(jié)構(gòu)時(shí),如 `list`。
inline 內(nèi)聯(lián)函數(shù)
特征
相當(dāng)于把內(nèi)聯(lián)函數(shù)里面的內(nèi)容寫在調(diào)用內(nèi)聯(lián)函數(shù)處;
相當(dāng)于不用執(zhí)行進(jìn)入函數(shù)的步驟,直接執(zhí)行函數(shù)體;
相當(dāng)于宏,卻比宏多了類型檢查,真正具有函數(shù)特性;
不能包含循環(huán)、遞歸、switch 等復(fù)雜操作;
在類聲明中定義的函數(shù),除了虛函數(shù)的其他函數(shù)都會(huì)自動(dòng)隱式地當(dāng)成內(nèi)聯(lián)函數(shù)。
使用
// 聲明1(加 inline,建議使用)
inline int functionName(int first, int secend,...);
// 聲明2(不加 inline)
int functionName(int first, int secend,...);
// 定義
inline int functionName(int first, int secend,...) {/****/};
// 類內(nèi)定義,隱式內(nèi)聯(lián)
class A {
int doA() { return 0; } // 隱式內(nèi)聯(lián)
}
// 類外定義,需要顯式內(nèi)聯(lián)
class A {
int doA();
}
inline int A::doA() { return 0; } // 需要顯式內(nèi)聯(lián)
編譯器對 inline 函數(shù)的處理步驟
將 inline 函數(shù)體復(fù)制到 inline 函數(shù)調(diào)用點(diǎn)處;
為所用 inline 函數(shù)中的局部變量分配內(nèi)存空間;
將 inline 函數(shù)的的輸入?yún)?shù)和返回值映射到調(diào)用方法的局部變量空間中;
如果 inline 函數(shù)有多個(gè)返回點(diǎn),將其轉(zhuǎn)變?yōu)?inline 函數(shù)代碼塊末尾的分支(使用 GOTO)。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
內(nèi)聯(lián)函數(shù)同宏函數(shù)一樣將在被調(diào)用處進(jìn)行代碼展開,省去了參數(shù)壓棧、棧幀開辟與回收,結(jié)果返回等,從而提高程序運(yùn)行速度。
內(nèi)聯(lián)函數(shù)相比宏函數(shù)來說,在代碼展開時(shí),會(huì)做安全檢查或自動(dòng)類型轉(zhuǎn)換(同普通函數(shù)),而宏定義則不會(huì)。
在類中聲明同時(shí)定義的成員函數(shù),自動(dòng)轉(zhuǎn)化為內(nèi)聯(lián)函數(shù),因此內(nèi)聯(lián)函數(shù)可以訪問類的成員變量,宏定義則不能。
內(nèi)聯(lián)函數(shù)在運(yùn)行時(shí)可調(diào)試,而宏定義不可以。
缺點(diǎn)
代碼膨脹。內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),消除函數(shù)調(diào)用帶來的開銷。如果執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間,相比于函數(shù)調(diào)用的開銷較大,那么效率的收獲會(huì)很少。另一方面,每一處內(nèi)聯(lián)函數(shù)的調(diào)用都要復(fù)制代碼,將使程序的總代碼量增大,消耗更多的內(nèi)存空間。
inline 函數(shù)無法隨著函數(shù)庫升級而升級。inline函數(shù)的改變需要重新編譯,不像 non-inline 可以直接鏈接。
是否內(nèi)聯(lián),程序員不可控。內(nèi)聯(lián)函數(shù)只是對編譯器的建議,是否對函數(shù)內(nèi)聯(lián),決定權(quán)在于編譯器。
虛函數(shù)(virtual)可以是內(nèi)聯(lián)函數(shù)(inline)嗎?
Are 'inline virtual' member functions ever actually 'inlined'?
答案:http://www.cs.technion.ac.il/users/yechiel/c++-faq/inline-virtuals.html
虛函數(shù)可以是內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)是可以修飾虛函數(shù)的,但是當(dāng)虛函數(shù)表現(xiàn)多態(tài)性的時(shí)候不能內(nèi)聯(lián)。
內(nèi)聯(lián)是在編譯器建議編譯器內(nèi)聯(lián),而虛函數(shù)的多態(tài)性在運(yùn)行期,編譯器無法知道運(yùn)行期調(diào)用哪個(gè)代碼,因此虛函數(shù)表現(xiàn)為多態(tài)性時(shí)(運(yùn)行期)不可以內(nèi)聯(lián)。
inline virtual 唯一可以內(nèi)聯(lián)的時(shí)候是:編譯器知道所調(diào)用的對象是哪個(gè)類(如 Base::who()),這只有在編譯器具有實(shí)際對象而不是對象的指針或引用時(shí)才會(huì)發(fā)生。
虛函數(shù)內(nèi)聯(lián)使用
#include <iostream>
using namespace std;
class Base
{
public:
inline virtual void who()
{
cout << 'I am Base\n';
}
virtual ~Base() {}
};
class Derived : public Base
{
public:
inline void who() // 不寫inline時(shí)隱式內(nèi)聯(lián)
{
cout << 'I am Derived\n';
}
};
int main()
{
// 此處的虛函數(shù) who(),是通過類(Base)的具體對象(b)來調(diào)用的,編譯期間就能確定了,所以它可以是內(nèi)聯(lián)的,但最終是否內(nèi)聯(lián)取決于編譯器。
Base b;
b.who();
// 此處的虛函數(shù)是通過指針調(diào)用的,呈現(xiàn)多態(tài)性,需要在運(yùn)行時(shí)期間才能確定,所以不能為內(nèi)聯(lián)。
Base *ptr = new Derived();
ptr->who();
// 因?yàn)锽ase有虛析構(gòu)函數(shù)(virtual ~Base() {}),所以 delete 時(shí),會(huì)先調(diào)用派生類(Derived)析構(gòu)函數(shù),再調(diào)用基類(Base)析構(gòu)函數(shù),防止內(nèi)存泄漏。
delete ptr;
ptr = nullptr;
system('pause');
return 0;
}
assert()
斷言,是宏,而非函數(shù)。assert 宏的原型定義在 <assert.h>(C)、<cassert>(C++)中,其作用是如果它的條件返回錯(cuò)誤,則終止程序執(zhí)行??梢酝ㄟ^定義 NDEBUG 來關(guān)閉 assert,但是需要在源代碼的開頭,include <assert.h> 之前。
使用
#define NDEBUG // 加上這行,則 assert 不可用
#include <assert.h>
assert( p != NULL ); // assert 不可用
sizeof()
sizeof 對數(shù)組,得到整個(gè)數(shù)組所占空間大小。
sizeof 對指針,得到指針本身所占空間大小。
#pragma pack(n)
設(shè)定結(jié)構(gòu)體、聯(lián)合以及類成員變量以 n 字節(jié)方式對齊
使用
#pragma pack(push) // 保存對齊狀態(tài)
#pragma pack(4) // 設(shè)定為 4 字節(jié)對齊
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop) // 恢復(fù)對齊狀態(tài)
位域
Bit mode: 2; // mode 占 2 位
類可以將其(非靜態(tài))數(shù)據(jù)成員定義為位域(bit-field),在一個(gè)位域中含有一定數(shù)量的二進(jìn)制位。當(dāng)一個(gè)程序需要向其他程序或硬件設(shè)備傳遞二進(jìn)制數(shù)據(jù)時(shí),通常會(huì)用到位域。
位域在內(nèi)存中的布局是與機(jī)器有關(guān)的
位域的類型必須是整型或枚舉類型,帶符號類型中的位域的行為將因具體實(shí)現(xiàn)而定
取地址運(yùn)算符(&)不能作用于位域,任何指針都無法指向類的位域
volatile
volatile int i = 10;
volatile 關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素(操作系統(tǒng)、硬件、其它線程等)更改。所以使用 volatile 告訴編譯器不應(yīng)對這樣的對象進(jìn)行優(yōu)化。
volatile 關(guān)鍵字聲明的變量,每次訪問時(shí)都必須從內(nèi)存中取出值(沒有被 volatile 修飾的變量,可能由于編譯器的優(yōu)化,從 CPU 寄存器中取值)
const 可以是 volatile (如只讀的狀態(tài)寄存器)
指針可以是 volatile
extern 'C'
被 extern 限定的函數(shù)或變量是 extern 類型的
被 extern 'C' 修飾的變量和函數(shù)是按照 C 語言方式編譯和連接的
extern 'C' 的作用是讓 C++ 編譯器將 extern 'C' 聲明的代碼當(dāng)作 C 語言代碼處理,可以避免 C++ 因符號修飾導(dǎo)致代碼不能和C語言庫中的符號進(jìn)行鏈接的問題。
'C' 使用
#ifdef __cplusplus
extern 'C' {
#endif
void *memset(void *, int, size_t);
#ifdef __cplusplus
}
#endif
struct 和 typedef struct
C 中
// c
typedef struct Student {
int age;
} S;
等價(jià)于
// c
struct Student {
int age;
};
typedef struct Student S;
此時(shí) S 等價(jià)于 struct Student,但兩個(gè)標(biāo)識符名稱空間不相同。
另外還可以定義與 struct Student 不沖突的 void Student() {}。
C++ 中
由于編譯器定位符號的規(guī)則(搜索規(guī)則)改變,導(dǎo)致不同于C語言。
一、如果在類標(biāo)識符空間定義了 struct Student {...};,使用 Student me; 時(shí),編譯器將搜索全局標(biāo)識符表,Student 未找到,則在類標(biāo)識符內(nèi)搜索。
即表現(xiàn)為可以使用 Student 也可以使用 struct Student,如下:
// cpp
struct Student {
int age;
};
void f( Student me ); // 正確,'struct' 關(guān)鍵字可省略
二、若定義了與 Student 同名函數(shù)之后,則 Student 只代表函數(shù),不代表結(jié)構(gòu)體,如下:
typedef struct Student {
int age;
} S;
void Student() {} // 正確,定義后 'Student' 只代表此函數(shù)
//void S() {} // 錯(cuò)誤,符號 'S' 已經(jīng)被定義為一個(gè) 'struct Student' 的別名
int main() {
Student();
struct Student me; // 或者 'S me';
return 0;
}
C++ 中 struct 和 class
總的來說,struct 更適合看成是一個(gè)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)體,class 更適合看成是一個(gè)對象的實(shí)現(xiàn)體。
區(qū)別
最本質(zhì)的一個(gè)區(qū)別就是默認(rèn)的訪問控制
默認(rèn)的繼承訪問權(quán)限。struct 是 public 的,class 是 private 的。
struct 作為數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)體,它默認(rèn)的數(shù)據(jù)訪問控制是 public 的,而 class 作為對象的實(shí)現(xiàn)體,它默認(rèn)的成員變量訪問控制是 private 的。
union 聯(lián)合
聯(lián)合(union)是一種節(jié)省空間的特殊的類,一個(gè) union 可以有多個(gè)數(shù)據(jù)成員,但是在任意時(shí)刻只有一個(gè)數(shù)據(jù)成員可以有值。當(dāng)某個(gè)成員被賦值后其他成員變?yōu)槲炊x狀態(tài)。聯(lián)合有如下特點(diǎn):
默認(rèn)訪問控制符為 public
可以含有構(gòu)造函數(shù)、析構(gòu)函數(shù)
不能含有引用類型的成員
不能繼承自其他類,不能作為基類
不能含有虛函數(shù)
匿名 union 在定義所在作用域可直接訪問 union 成員
匿名 union 不能包含 protected 成員或 private 成員
全局匿名聯(lián)合必須是靜態(tài)(static)的
使用
#include<iostream>
union UnionTest {
UnionTest() : i(10) {};
int i;
double d;
};
static union {
int i;
double d;
};
int main() {
UnionTest u;
union {
int i;
double d;
};
std::cout << u.i << std::endl; // 輸出 UnionTest 聯(lián)合的 10
::i = 20;
std::cout << ::i << std::endl; // 輸出全局靜態(tài)匿名聯(lián)合的 20
i = 30;
std::cout << i << std::endl; // 輸出局部匿名聯(lián)合的 30
return 0;
}
C 實(shí)現(xiàn) C++ 類
C 語言實(shí)現(xiàn)封裝、繼承和多態(tài):
http://dongxicheng.org/cpp/ooc/
explicit(顯式)構(gòu)造函數(shù)
explicit 修飾的構(gòu)造函數(shù)可用來防止隱式轉(zhuǎn)換
explicit 使用
class Test1
{
public:
Test1(int n) // 普通構(gòu)造函數(shù)
{
num=n;
}
private:
int num;
};
class Test2
{
public:
explicit Test2(int n) // explicit(顯式)構(gòu)造函數(shù)
{
num=n;
}
private:
int num;
};
int main()
{
Test1 t1=12; // 隱式調(diào)用其構(gòu)造函數(shù),成功
Test2 t2=12; // 編譯錯(cuò)誤,不能隱式調(diào)用其構(gòu)造函數(shù)
Test2 t2(12); // 顯式調(diào)用成功
return 0;
}
friend 友元類和友元函數(shù)
能訪問私有成員
破壞封裝性
友元關(guān)系不可傳遞
友元關(guān)系的單向性
友元聲明的形式及數(shù)量不受限制
using
using 聲明
一條 using 聲明 語句一次只引入命名空間的一個(gè)成員。它使得我們可以清楚知道程序中所引用的到底是哪個(gè)名字。如:
using namespace_name::name;
構(gòu)造函數(shù)的 using 聲明【C++11】
在 C++11 中,派生類能夠重用其直接基類定義的構(gòu)造函數(shù)。
class Derived : Base {
public:
using Base::Base;
/* ... */
};
如上 using 聲明,對于基類的每個(gè)構(gòu)造函數(shù),編譯器都生成一個(gè)與之對應(yīng)(形參列表完全相同)的派生類構(gòu)造函數(shù)。生成如下類型構(gòu)造函數(shù):
derived(parms) : base(args) { }
using 指示
using 指示 使得某個(gè)特定命名空間中所有名字都可見,這樣我們就無需再為它們添加任何前綴限定符了。如:
using namespace_name name;
盡量少使用 `using 指示` 污染命名空間
一般說來,使用 using 命令比使用 using 編譯命令更安全,這是由于它只導(dǎo)入了制定的名稱。如果該名稱與局部名稱發(fā)生沖突,編譯器將發(fā)出指示。using編譯命令導(dǎo)入所有的名稱,包括可能并不需要的名稱。如果與局部名稱發(fā)生沖突,則局部名稱將覆蓋名稱空間版本,而編譯器并不會(huì)發(fā)出警告。另外,名稱空間的開放性意味著名稱空間的名稱可能分散在多個(gè)地方,這使得難以準(zhǔn)確知道添加了哪些名稱。
using 使用
盡量少使用 using 指示
using namespace std;
應(yīng)該多使用 using 聲明
int x;
std::cin >> x ;
std::cout << x << std::endl;
或者
using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;
:: 范圍解析運(yùn)算符
分類
全局作用域符(::name):用于類型名稱(類、類成員、成員函數(shù)、變量等)前,表示作用域?yàn)槿置臻g
類作用域符(class::name):用于表示指定類型的作用域范圍是具體某個(gè)類的
命名空間作用域符(namespace::name):用于表示指定類型的作用域范圍是具體某個(gè)命名空間的
:: 使用
int count = 0; // 全局(::)的 count
class A {
public:
static int count; // 類 A 的 count(A::count)
};
int main() {
::count = 1; // 設(shè)置全局的 count 的值為 1
A::count = 2; // 設(shè)置類 A 的 count 為 2
int count = 0; // 局部的 count
count = 3; // 設(shè)置局部的 count 的值為 3
return 0;
}
enum 枚舉類型
限定作用域的枚舉類型
enum class open_modes { input, output, append };
不限定作用域的枚舉類型
enum color { red, yellow, green };
enum { floatPrec = 6, doublePrec = 10 };
decltype
decltype 關(guān)鍵字用于檢查實(shí)體的聲明類型或表達(dá)式的類型及值分類。語法:
decltype ( expression )
使用
// 尾置返回允許我們在參數(shù)列表之后聲明返回類型
template <typename It>
auto fcn(It beg, It end) -> decltype(*beg)
{
// 處理序列
return *beg; // 返回序列中一個(gè)元素的引用
}
// 為了使用模板參數(shù)成員,必須用 typename
template <typename It>
auto fcn2(It beg, It end) -> typename remove_reference<decltype(*beg)>::type
{
// 處理序列
return *beg; // 返回序列中一個(gè)元素的拷貝
}
引用
左值引用
常規(guī)引用,一般表示對象的身份。
右值引用
右值引用就是必須綁定到右值(一個(gè)臨時(shí)對象、將要銷毀的對象)的引用,一般表示對象的值。
右值引用可實(shí)現(xiàn)轉(zhuǎn)移語義(Move Sementics)和精確傳遞(Perfect Forwarding),它的主要目的有兩個(gè)方面:
消除兩個(gè)對象交互時(shí)不必要的對象拷貝,節(jié)省運(yùn)算存儲(chǔ)資源,提高效率。
能夠更簡潔明確地定義泛型函數(shù)。
引用折疊
X& &、X& &&、X&& & 可折疊成 X&
X&& && 可折疊成 X&&
宏
宏定義可以實(shí)現(xiàn)類似于函數(shù)的功能,但是它終歸不是函數(shù),而宏定義中括弧中的“參數(shù)”也不是真的參數(shù),在宏展開的時(shí)候?qū)?“參數(shù)” 進(jìn)行的是一對一的替換。
成員初始化列表
好處
更高效:少了一次調(diào)用默認(rèn)構(gòu)造函數(shù)的過程。
有些場合必須要用初始化列表:
常量成員,因?yàn)槌A恐荒艹跏蓟荒苜x值,所以必須放在初始化列表里面
引用類型,引用必須在定義的時(shí)候初始化,并且不能重新賦值,所以也要寫在初始化列表里面
沒有默認(rèn)構(gòu)造函數(shù)的類類型,因?yàn)槭褂贸跏蓟斜砜梢圆槐卣{(diào)用默認(rèn)構(gòu)造函數(shù)來初始化,而是直接調(diào)用拷貝構(gòu)造函數(shù)初始化。
initializer_list 列表初始化【C++11】
用花括號初始化器列表列表初始化一個(gè)對象,其中對應(yīng)構(gòu)造函數(shù)接受一個(gè) std::initializer_list 參數(shù).
initializer_list 使用
#include <iostream>
#include <vector>
#include <initializer_list>
template <class T>
struct S {
std::vector<T> v;
S(std::initializer_list<T> l) : v(l) {
std::cout << 'constructed with a ' << l.size() << '-element list\n';
}
void append(std::initializer_list<T> l) {
v.insert(v.end(), l.begin(), l.end());
}
std::pair<const T*, std::size_t> c_arr() const {
return {&v[0], v.size()}; // 在 return 語句中復(fù)制列表初始化
// 這不使用 std::initializer_list
}
};
template <typename T>
void templated_fn(T) {}
int main()
{
S<int> s = {1, 2, 3, 4, 5}; // 復(fù)制初始化
s.append({6, 7, 8}); // 函數(shù)調(diào)用中的列表初始化
std::cout << 'The vector size is now ' << s.c_arr().second << ' ints:\n';
for (auto n : s.v)
std::cout << n << ' ';
std::cout << '\n';
std::cout << 'Range-for over brace-init-list: \n';
for (int x : {-1, -2, -3}) // auto 的規(guī)則令此帶范圍 for 工作
std::cout << x << ' ';
std::cout << '\n';
auto al = {10, 11, 12}; // auto 的特殊規(guī)則
std::cout << 'The list bound to auto has size() = ' << al.size() << '\n';
// templated_fn({1, 2, 3}); // 編譯錯(cuò)誤!“ {1, 2, 3} ”不是表達(dá)式,
// 它無類型,故 T 無法推導(dǎo)
templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK
templated_fn<std::vector<int>>({1, 2, 3}); // 也 OK
}
面向?qū)ο?div style="height:15px;">
面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-oriented programming,OOP)是種具有對象概念的程序編程典范,同時(shí)也是一種程序開發(fā)的抽象方針。