强制类型转换:
Dynamic_cast:支持运行时识别指针或引用所指向对象。
Const_cast:将转换掉const性质。例如const char*pstr;const_cast<char*>(pstr);
Static_cast:编译器隐式执行的任何类型转换都可以由static_cast显示完成
当将一个较大的算术类型赋值给较小的类型是,使用强制转换非常有用
Double dval; Static_cast<int>(dval)//将double转换成int
Reinterpret_cast通常为操作数的为模式提供较低乘此的重新解释。
强制类型转换关闭或挂起了正常的类型检查,强力建议程序员避免使用强制类型转换,不依赖强制类型转换也能写出很好c++程序。
如果在条件表达式中定义了变量,那么变量必须出示话,将以初始化的变量值转换为bool后判断:如:if(int ival =compute_value())
深层嵌套的if_else语句往往在语法上是正确的,但在逻辑上却没有正确的反应程序员的意图。Switch语句是一种方便的方法来是吸纳深层嵌套的if/else逻辑。
但存在一个普遍的误解,以为程序只会执行匹配的case标号相关联的语句,实际上程序从该点执行,并跨越case边界继续执行其他语句,知道switch结束或遇到break为止。
对于switch语句只能在它的最后一个case标号或default标号后面定义变量:
Switch(con) switch(con)
{ {
Case 1: case 1:
Inti=90;//这事错误的; {
……. Int i=90;//这是正确的;
……
Case 2: }
……. Case2:
………
} }
注意这两者的区别。
可以再for语句的init_statement中定义多个对象,但不管怎样,该处只能出现一个语句,因此所有的对象必须具有相同的一般类型。
例如:for(int ival=0,*pi=ia,&ri=val;ival!=size; ++val,++pi,++ri)
与while不同,do while语句总是以分号结束。都是为真则执行。
Break语句用于结束最近的while,dowhile ,for,switch语句,并将程序的执行权传给紧接在被终止语句之后的语句。Break只能用在循环或switch语句中。当break出现在嵌套的switch语句中时,将会终止里层的switch语句。而外层的switch或循环不受影响。
Continue语句导致最近的循环语句的当次迭代提前结束。只能出现在循环语句中。
在<stdexcept>中定义的标准异常类
Exception最常见的问题
Runtime_error 运行时错误,尽在运行时才能检测到的问题
Range_error运行时错误:生成的结果超过了有意义的值域范围,
Overflow_error运行时错误:计算上溢;
Underflow_error运行时错误:计算下溢
Logic_error逻辑错误:可在运行前检测到的问题
Domain_error逻辑错误:参数的结果值不存在
Invalid_argument逻辑错误:不合适的参数;
Length_error逻辑错误:试图生成一个超出该类型最大长度的对象
Out_of_range逻辑错误:使用一个超出有效范围的值。
异常类型之定义了一个名为what的错做,这个函数不需要任何参数,并且返回const char *类型的值,它返回一个c风格字符串,使用c风格字符串的目的是为所跑出的异常提供更详细的文字描述。
每次调用函数时都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。
函数的形参可以使指针,此时将复制实参指针,与其他费引用类型的形参一样,该类形参的任何改变也仅作用于局部副本,如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。
从避免复制vector的的角度出发,应考虑将形参声明为引用类型,然而随着c++的学习我们会知道程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器。
例如:void print (vector<int>::const_iterator beg,vector<int>::const_iteratorend)
{
While(beg!=end)
Cout<<*beg++;
}
可以用以下3种方式制定数组形参:
Void print(int *);
Void print(int[]);
Void print(int[10]);//这种经常会引起误解。如:向此函数传递a[2];编译不会错,运行会错。
Int main(int argc, int *argc[])第二个形参argv是一个c风格字符串数组,第一个形参argc则用于传递该数组中字符串的个数,由于第二参数是一个数组,