C++笔记

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); 

猜你喜欢

转载自blog.csdn.net/yshshhgxq/article/details/80630320