C++笔记

xiaoxiao2021-02-28  63

C++中的显式转换(强制类型转换)    本质上非常危险,不建议使用! 通用形式: cast-name<type>(expression) type指转换的目标类型,expression是要转换的值,cast-name是static_cast,dynamic_cast,const_cast和reinterpret_cast中的一种。 1.static_cast      任何具有明确定义的类型转换,只要不包含底层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 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<T> lst;  默认初始化;T类型元素的空列表。 initializer_list<T> lst{a,b,c,d...}  lst的元素数量和初始值一样多;lst的元素是对应初始值的副本;列表中的元素是const lst2=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]; //等价于上面的typedef   arr* 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); 
转载请注明原文地址: https://www.6miu.com/read-2626644.html

最新回复(0)