以下内容为笔者手打,望读者珍惜,如有转载还请注明。
$1.4强制类型转化运算符的新形式:
类型名(待转化的表达式),如double(a),int(3.5)
$1.5函数参数的默认值
在C++中,声明一个函数时,可以为函数的参数指定默认值.当调用有默认参数值的函数时,
可以不写出参数,这时就相当于以默认值作为参数调用该函数.
void func1(int x=20);
func1();//自动调用20
不仅可以用常数,还可以用任何有定义的表达式作为参数的默认值.
如int Max(int m,int n);
int a,b;
void func2(int x,int y=Max(a,b),int z=a*b);{
……
}
func2(4);//正确:相当于func2(4,Max(a,b),a*b);
func2(4,9);//正确:相当于func2(4,9,a*b);
func2(4,2,3);//OK
func2(4,,3);//error!
$1.6引用
引用的初始化只能用变量,不能表达式(除非该表达式的返回值是某一个变量的引用)也不能常量
参数传引用:
void swap(int &a,int &b){
int tmp;tmp=a;a=b;b=tmp;
}
int main()
{
int n1=100,n2=200;
swap(n1,n2);cout<
常引用
int n;
const int &r=n;
不能通过常引用去修改其引用的内容:不是常引用所引用的内容不能修改,而是不能通过常引用
去修改.
内联函数要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,
但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字.
调用内联函数的语句前必须已经出现内联函数的定义(即整个函数体),而不能只出现函数的声明.
$1.8函数的重载:小心数据类型产生二义性(如max(2.4,4)不知道应该归属于max(float,float)
还是max(int,int))(两同名函数一个的数据类型包含于另一个,且较大的函数可以取默认值时
也产生二义性)
$1.9指针和动态内存分配
P=new T;//T是任意类型名,P是类型为T*的指针.这样的语句会动态分配出来一片大小为sizeof
(T)字节的内存空间,并将该内存空间的起始地址赋值给P.
例如:int *p;
p=new int;//动态分配了一片4个字节大小的内存空间,p指向这片空间.通过p可以读写该内存空间.
*p=5;
delete p;
P=new T[N];//T是任意类型名,P是类型为T*的指针,N代表元素个数,可以是任何值为正整数
的表达式,表达式中可以包含变量、函数调用等.
例:int *pn;
int i=5;
pn = new int [i*20];
pn[0]=3,pn[7]=5;
delete []pn;
void initialzation(int w_,int h_){//初始化(后面可以用构造函数代替)
w=w_;h=h_;
}
class Crec{
……
}
int(类型) a,b(变量);
Crec(类) r(对象);
$1.10用string对象处理字符串
string是C++标准模板库中的一个“类”,而不是C++标准数据类型.
要使用string对象,必须包含头文件
$1.10.1定义:string str1;string str2="Beijing";
sizeof(string)是固定的,其值视编译器不同而变,与其中存放的字符串长度无关.
string对象中并不直接存放字符串,字符串会在别处开辟内存空间存放.string对象中只存放
该内存空间的地址,或者一些其他信息.
string对象数组也可以定义:string as[]={"Beijing","shanghai"};
string可以直接赋值
"abc">"123456"string的比较是逐位进行的
string对象之间可以使用"<","<=","==",">=",">"等运算符依ASCⅡ码比较.
可以用加号将string与string/字符数组/字符串常量相加:简单嫁接
一些string对象的成员函数举例:
string str1="abc1234";char str[20];
cout<