• C++之委托构造函数实例(二百四十三)


    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

    人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

    更多原创,欢迎关注:Android系统攻城狮

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:理解C++之委托构造函数用法。

    2.C++之委托构造函数介绍

    委托构造函数是C++11引入的一个特性,允许某个构造函数在初始化列表中调用同一个类中的其他构造函数。这样可以避免代码重复,提高代码的可维护性和重用性。

    在C++中,一个类可以有多个构造函数,每个构造函数负责初始化对象的不同部分或者提供不同的参数选项。在某些情况下,多个构造函数会有一些共同的初始化代码,这就会导致代码冗余。委托构造函数解决了这个问题,让一个构造函数可以重用其他构造函数的初始化代码。

    委托构造函数的语法非常简单,就是在构造函数的初始化列表中使用其他构造函数的调用。具体来说,委托构造函数的语法如下:

    class ClassName {
    public:
        ClassName(参数列表) : 构造函数调用 {
            // 初始化代码
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在上面的语法中,构造函数调用就是委托给其他构造函数的调用。
    使用委托构造函数的一些注意事项:

    1. 委托构造函数只能在初始化列表中调用,不能在构造函数的函数体内部调用。
    2. 委托构造函数的调用必须放在构造函数的初始化列表的最开始。
    3. 一个类可以有多个委托构造函数,它们之间可以相互调用。
    4. 如果委托构造函数没有给出初始化列表,那么默认会调用隐式的默认构造函数。
    5. 委托构造函数的调用顺序和委托的顺序无关,只与初始化列表中的顺序有关。

    3.实例

    v1.0

    #include 
    #include 
    
    class SurfaceFlinger {
    public:
      SurfaceFlinger(std::string service_name, int num) : SurfaceFlinger(service_name) {
        printf("xxx--------->%s(), line = %d, service_name = %s, num = %d\n",__FUNCTION__,__LINE__,service_name.c_str(),num);
      }
    
      explicit SurfaceFlinger(std::string &service_name) {
        printf("xxx--------->%s(), line = %d, service_name = %s\n",__FUNCTION__,__LINE__,service_name.c_str());
      }
    };
    
    int main() {
      SurfaceFlinger sf1("Hello World", 1001);
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    打印:
    xxx--------->SurfaceFlinger(), line = 11, service_name = Hello World
    xxx--------->SurfaceFlinger(), line = 7, service_name = Hello World, num = 1001

    总结

    • SurfaceFlinger(std::string service_name, int num)构造函数初始化列表中调用了SurfaceFlinger(service_name)构造函数,并且将service_name传给单个参数的构造函数。
    • 被调用的构造函数SurfaceFlinger(service_name)要比调用者 SurfaceFlinger(std::string service_name, int num)先执行。

    v2.0

    #include 
    #include 
    
    class SurfaceFlinger {
    public:
      SurfaceFlinger(std::string service_name, int num) : SurfaceFlinger(service_name) {
        printf("xxx--------->%s(), line = %d, service_name = %s, num = %d\n",__FUNCTION__,__LINE__,service_name.c_str(),num);
      }
    
      explicit SurfaceFlinger(std::string &service_name): Fname(service_name) {
        printf("xxx--------->%s(), line = %d, service_name = %s, Fname = %s\n",__FUNCTION__,__LINE__,service_name.c_str(),Fname.c_str());
      }
      private:
      std::string Fname;
    };
    
    int main() {
      SurfaceFlinger sf1("MrZhang", 1001);
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    总结

    • SurfaceFlinger(std::string service_name, int num)函数将service_name通过构造函数列表传递给被调用的构造函数SurfaceFlinger(service_name)
    • 被委托构造函数SurfaceFlinger(std::string &service_name): Fname(service_name)将service_name传给成员变量Fname。
  • 相关阅读:
    【AI 编程助手】DevChat 解析:深入了解、快速配置与实际操作案例的完整指南
    TheRouter 框架原理
    FT2004(D2000)开发实战之U-boot环境变量
    在Linux中进行Prometheus部署
    部署Zookeeper集群和Kafka集群
    Nacos源码系列—服务端那些事儿
    More effective C++:条款3.绝对不要以多态方式处理数组及条款4:非必要不提供default construcor
    oracle 11g 通过主机的RMAN备份,测试库异机恢复数据库,rman报错
    shell脚本中$0 $1 $# $@ $* $? $ 的各种符号的意义
    软件需求工程R 第三、四章
  • 原文地址:https://blog.csdn.net/u010164190/article/details/133819871