• Primer笔记——显式转换、返回数组指针的函数、const形参函数重载


    目录

    一.P144 显式转换

    ①static_cast

    ②const_cast

    ③reinterpret_cast

    二.P205 声明一个返回数组指针的函数

    ①普通写法:

    ② 尾置返回类型(C++11)

    ③decltype写法 

    ④类型别名写法(个人比较推荐)

    三.P208 重载和const形参


    顶层const:指针本身是const属性(常量指针),例:int const* p;

    底层const:指针指向const类型对象空间(指向常量的指针),例:const int* p;

    一.P144 显式转换

    static_cast

    static_cast<转换类型>(实参);

    只要不是底层const都可以通过该函数转换。

    该函数可以用来找回存于void*指针中的值

    值得注意,如果指针转化后类型并不是数据本身类型,也会报错,结果未定义。

    1. int a = 3;
    2. char b = static_cast<char>(a);//类型缩小
    3. void* c = &a;
    4. char* d = static_cast<char*>(c);//找回值
    5. int* e = &a;
    6. char* f = static_cast<char*>(e);//报错,结果未定义

    const_cast

    const_cast<转换类型>(实参);

    该函数用来去掉顶层const或底层const(可都去掉)。

    这是一种非常暴力的行为,会直接去掉const属性获得写权限。如果是常量对象,进行写操作将产生未定义后果。

    1. int a = 3;
    2. const int* const b = &a;
    3. int* d = const_cast<int*>(b);//去掉顶层const与底层const

    reinterpret_cast

     reinterpret_cast<转换类型>(实参);

    可以将指针数据给指向不同类型的指针,新的指针会认为指向对象是转换后类型。

    1. int a = 3;
    2. int* b = &a;
    3. char* d = reinterpret_cast<char*>(b);//正确
    4. char* e = static_cast<char*>(b);//错误

    《C++ Primer》不建议使用reinterpret_cast,它会改变类型而且不报警告,十分危险。 

    二.P205 声明一个返回数组指针的函数

    数组指针:形如 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数组指针的引用。

    四种形式:

    ①普通写法:

    1. string (&func(string (&str)[10]))[10]
    2. {
    3. //...
    4. return str;
    5. }

     剖析:

    1. 返回类型 返回的是一个引用 参数类型 参数是一个引用 参数对象是长度10的数组 函数返回的引用的对象是数组
    2. string ( &func (string (&str) [10]) ) [10];

    ② 尾置返回类型(C++11)

    1. auto func(string (&str)[10])->string (&)[10]
    2. {
    3. //...
    4. return str;
    5. }

    ③decltype写法 

    1. string a[10];
    2. decltype(a)&func(string (&str)[10])
    3. {
    4. //...
    5. return str;
    6. }

    ④类型别名写法(个人比较推荐)

    1. using RET = string(&)[10];
    2. RET func(RET str)
    3. {
    4. //...
    5. return str;
    6. }

    三.P208 重载和const形参

    使用函数重载时,顶层const不能进行重载,底层可以。

    原因:传入指针实参时,常量指针和普通指针都能被常量指针指针接收。但指向常量的指针不能被普通指针形参接收,只能被指向常量的指针形参接受。

    1. void func(int* p) {}
    2. void func(const int* p) {}//正确重载
    3. void func(int* const p) {}//错误重载

    如有错误,敬请斧正

  • 相关阅读:
    海外代理IP与VPN有何区别?哪个更好?
    Spring Security 6.x 系列【66】认证篇之集成 LDAP 登录
    深度学习——(9)神经网络参数详解
    【原创】java+swing+mysql通讯录管理系统设计与实现
    性能测试需求分析
    Nginx搭建RTMP流媒体服务器(Ubuntu18.04)
    java数据结构与算法刷题-----LeetCode108:将有序数组转换为二叉搜索树
    Jetson Orin&NX平台 FPDlink Ⅲ相机采集---双目场景应用
    排序不等式算法
    java定时任务
  • 原文地址:https://blog.csdn.net/weixin_61857742/article/details/128035269