目录
顶层const:指针本身是const属性(常量指针),例:int const* p;
底层const:指针指向const类型对象空间(指向常量的指针),例:const int* p;
static_cast<转换类型>(实参);
只要不是底层const都可以通过该函数转换。
该函数可以用来找回存于void*指针中的值。
值得注意,如果指针转化后类型并不是数据本身类型,也会报错,结果未定义。
- int a = 3;
- char b = static_cast<char>(a);//类型缩小
- void* c = &a;
- char* d = static_cast<char*>(c);//找回值
- int* e = &a;
- char* f = static_cast<char*>(e);//报错,结果未定义
const_cast<转换类型>(实参);
该函数用来去掉顶层const或底层const(可都去掉)。
这是一种非常暴力的行为,会直接去掉const属性获得写权限。如果是常量对象,进行写操作将产生未定义后果。
- int a = 3;
- const int* const b = &a;
- int* d = const_cast<int*>(b);//去掉顶层const与底层const
reinterpret_cast<转换类型>(实参);
可以将指针数据给指向不同类型的指针,新的指针会认为指向对象是转换后类型。
- int a = 3;
- int* b = &a;
- char* d = reinterpret_cast<char*>(b);//正确
- char* e = static_cast<char*>(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) {}//错误重载
如有错误,敬请斧正