目录
一.P144 显式转换
①static_cast
②const_cast
③reinterpret_cast
二.P205 声明一个返回数组指针的函数
①普通写法:
② 尾置返回类型(C++11)
③decltype写法
④类型别名写法(个人比较推荐)
三.P208 重载和const形参
顶层const:指针本身是const属性(常量指针),例:int const* p;
底层const:指针指向const类型对象空间(指向常量的指针),例:const int* p;
static_cast<转换类型>(实参);
只要不是底层const都可以通过该函数转换。
该函数可以用来找回存于void*指针中的值。
值得注意,如果指针转化后类型并不是数据本身类型,也会报错,结果未定义。
int a = 3;
char b = static_cast(a);//类型缩小
void* c = &a;
char* d = static_cast(c);//找回值
int* e = &a;
char* f = static_cast(e);//报错,结果未定义
const_cast<转换类型>(实参);
该函数用来去掉顶层const或底层const(可都去掉)。
这是一种非常暴力的行为,会直接去掉const属性获得写权限。如果是常量对象,进行写操作将产生未定义后果。
int a = 3;
const int* const b = &a;
int* d = const_cast(b);//去掉顶层const与底层const
reinterpret_cast<转换类型>(实参);
可以将指针数据给指向不同类型的指针,新的指针会认为指向对象是转换后类型。
int a = 3;
int* b = &a;
char* d = reinterpret_cast(b);//正确
char* e = static_cast(b);//错误
《C++ Primer》不建议使用reinterpret_cast,它会改变类型而且不报警告,十分危险。
数组指针:形如 int (*a)[10],本质是一个指针,指向数组。
函数形式如下:
类型 (*函数 (形参) ) [数组大小]
举例:
int (*func(int i))[10];
分析:
func(int i)说明这是一个函数,参数为int i。
(*func(int i)):可对函数进行解引用操作,说明返回值是一个指针。
(*func(int i))[10]:说明指针指向对象是长度为10的数组。
int (~)[10]:说明指针指向的数组类型为整形。
拓展:
参数为string数组指针的引用的函数,返回值是string数组指针的引用。
四种形式:
string (&func(string (&str)[10]))[10]
{
//...
return str;
}
剖析:
返回类型 返回的是一个引用 参数类型 参数是一个引用 参数对象是长度10的数组 函数返回的引用的对象是数组
string ( &func (string (&str) [10]) ) [10];
auto func(string (&str)[10])->string (&)[10]
{
//...
return str;
}
string a[10];
decltype(a)&func(string (&str)[10])
{
//...
return str;
}
using RET = string(&)[10];
RET func(RET str)
{
//...
return str;
}
使用函数重载时,顶层const不能进行重载,底层可以。
原因:传入指针实参时,常量指针和普通指针都能被常量指针指针接收。但指向常量的指针不能被普通指针形参接收,只能被指向常量的指针形参接受。
void func(int* p) {}
void func(const int* p) {}//正确重载
void func(int* const p) {}//错误重载
如有错误,敬请斧正