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
允许将形参定义为函数类型,但函数的返回值必须是指向函数的指针,不能是函数。