1. 通過增加後綴L,U或UL,能強制將整型字面值轉換爲long,unsigned,unsigned long.
多字節字符串轉寬字節字符串前加L,如”hello”->L”hello”
2.多行字符串的連接。
cout<<”a multiline”
“string”
<<endl;
多行字面值的連接
std::cou/
t<<”print”<<endl;
3.const可以替代define,避免使用魔數。
定義時必須初始化,而且以後不能再修改。
默認爲文件的局部變量,要想在其他文件中訪問,定義時指定extern。
4. 引用
引用是別名,定義時必須初始化,只要該引用存在,它就保持綁定到初始化時指向的對象,不能將引用綁定到另一對象。
非const引用只能綁定到與該引用同類型的對象。
const引用可以綁定到不同但相關的類型的對象或綁定到右值。
5.指針
對指針進行初始化或賦值只能使用以下四種類型的值:
(1)0值常量表達式
(2)類型匹配的對象的地址
(3)另一對象之後的下一地址
(4)同類型的另一個有效指針
void*指針可以保存任何類型對象的地址。
指向const對象的指針,const指針
6.指針訪問數組
int ia[]={0,2,4,6,8};
int* ip = ia;
ip=&ia[3];
(1) 指針的算術運算
ip = ia;
int* ip2 = ip + 4;
指針的算術操作只有在原指針和計算出來的新指針都指向同一個數組的元素,或紙箱該數組存儲空間的下一單元時才合法。
(2) 解引用和指針算術操作之間的相互作用
int last = *(ia+4);
(3) 下標和指針
int* p=&ia[2];
int j=p[1]; //points ia[3]
int k=p[-2]; //points ia[0]
(4) 計算數組的超出末端指針
const size_t arr_size=5;
int arr[arr_size]={1,2,3,4,5};
int* p=arr;
int* p2=p+arr_size;
(5) 輸出數組元素
for(int* begin=arr; begin!=arr+arr_size;++begin)
cout<<*begin<<’ ‘;
指針是數組的迭代器。
7.vector和其它容器類型的形參
c++程序員傾向於通過傳遞指向容器中需要處理的元素的迭代器來傳遞容器。
void print(vector<int>::const_iterator beg,vector<int>::const_iterator end)
{
while(beg != end)
{
cout<<*beg++;
if(beg != end)
cout<<” “;
}
}
8.數組形參
數組有兩個特殊的性質:影響我們定義和使用作用在數組上的函數:一是不能複製數組,二是使用數組名字時,數組名字會自動轉化爲指向第一個元素的指針。
三種方式指定數組形參:
void printValues(int*);
void printValues(int []);
void printValues(int[10]); //此處長度容易引起誤解,沒什麼用
通過引用傳遞數組
void printValues( int (&arr)[10]);
有三種技巧確保函數的操作不超出數組的邊界,一是數組本身放置一個標記檢測數組的結束,如字符數組,二是傳遞指向數組第一個和最後一個元素的下一個位置的指針。三是將第二個形參定義爲數組的大小。
9.函數指針
bool (*pf)(const string&,const string&);
typedef bool (*cmpFcn)(const string&,const string&);
bool lengthCompare(const string&,const string&);
cmpFcn pf1=0;
pf1=lengthCompare;
調用
lengthCompare(“hi”,”bye”); //直接調用
pf1(“hi”,”bye”); //隱式解引用
(*pf1) (“hi”,”bye”); //顯式解引用
函數指針作形參
void useBigger(const string& ,const string&, bool (*)(const string&,const string&));
函數指針作返回值
int (*ff(int))(int*,int); //該函數名爲ff,一個int形參,返回函數指針,指向的函數形參爲//(int*,int),返回爲int
允許將形參定義爲函數類型,但函數的返回值必須是指向函數的指針,不能是函數。