C++中的显式转换(强制类型转换)
本质上非常危险,不建议使用!
通用形式: cast-name<type>(expression)
本质上非常危险,不建议使用!
通用形式: cast-name<type>(expression)
type指转换的目标类型,expression是要转换的值,cast-name是static_cast,dynamic_cast,const_cast和reinterpret_cast中的一种。
1.static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用。
任何具有明确定义的类型转换,只要不包含底层const,都可以使用。
例:double slope = static_cast<double>(j)/i;static_cast对于编译器无法自动执行的类型转换也非常有用。例:void *p = &d; //正确,任何非常量对象的地址都能存入void *double *dp = static_cast<double*>(p); //正确,将void *转换回初始的指针类型。
2.const_cast(C++中一旦const限定则不能再改变该值)
只能改变运算对象的底层const
只能改变运算对象的底层const
const char *pc;char *p = const_cast<char *>(pc); //正确,但是通过p写值是未定义的行为对于将常量对象转换成非常量对象的行为称其为“去掉const性质”。一旦去掉了某个对象的const性质,编译器就不在阻止我们对该对象进行写操作。
3.reinterpret_cast
通常为运算对象的位模式提供较低层次上的重新解释。假设有如下转换int *ip;char *pc=reinterpret_cast<char*>(ip);必须牢记pc所指的真实对象是一个int而非字符。
含有可变形参的函数
当要传递的实参为同一类型但是数量未知时,我们可以使用initializer_list.它是一种标准库类型,用于表示某种特定类型的值的数组,定义在同名的头文件中。
initializer提供的操作:
当要传递的实参为同一类型但是数量未知时,我们可以使用initializer_list.它是一种标准库类型,用于表示某种特定类型的值的数组,定义在同名的头文件中。
initializer提供的操作:
initializer_list<T> lst; 默认初始化;T类型元素的空列表。initializer_list<T> lst{a,b,c,d...} lst的元素数量和初始值一样多;lst的元素是对应初始值的副本;列表中的元素是constlst2=lst||lst2(lst) 拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后原始列表和副本共享lst.size() 列表中的元素数量lst.begin() 返回指向首元素的指针lst.end() 返回尾元素下一位置的指针
和vector一样,initializer_list也是一种模板类型,定义时必须说明类型,不同的是,它的元素永远是常量值。
void error_mas(ErrCode e,initializer_list<string> il) { cout<<e.msg()<<"."; for(const auto &elem:il) //或者for(auto beg=il.begin();beg!=il.end();++beg) cout<<*beg<<" "; cout<<elem<<" "; cout<<endl; }
调用此函数需额外传递一个ErrCode实参:
if(expected!=actual) error_msg(ErrCode(42),{"functionX",expected,actual}); //expected,actual都是string类型 else error_msg(ErrCode(0),{"functionX","okay"}); //传递时元素列表需用花括号括起来
声明一个返回数组指针的函数
1.typedef int arr[10]; //arr是一个类型别名,表示含有十个整数的数组using arr=int[10]; //等价于上面的typedefarr* func(int i); //func返回一个指向含有十个整数的数组的指针2.int (*func(int i))[10];3.auto func(int i)->int(*)[10]; //尾置返回类型4.int odd[]={1,3,5,7,9};int even[]={0,2,4,6,8};decltype(odd) *arrPtr(int i){return (i%2)? &odd:&even; //返回一个指向数组的指针。}arrPtr使用关键字decltype表示他的返回类型是个指针,并且所指对象与odd一致。decltype只负责识别odd的类型,而不能转换为对应的指针,所以需要添加 *
声明一个返回指向函数的指针的函数
与上面声明返回数组指针的函数类似,这里不做额外的说明。
与上面声明返回数组指针的函数类似,这里不做额外的说明。
1.using F=int (int*,int);using PF=int (*)(int *,int);PF f1(int);F *f1(int);2.int (*f1(int))(int *,int);3.auto f1(int)->int(*)(int*,int);