简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解C++之委托构造函数用法。
2.C++之委托构造函数介绍
委托构造函数是C++11引入的一个特性,允许某个构造函数在初始化列表中调用同一个类中的其他构造函数。这样可以避免代码重复,提高代码的可维护性和重用性。
在C++中,一个类可以有多个构造函数,每个构造函数负责初始化对象的不同部分或者提供不同的参数选项。在某些情况下,多个构造函数会有一些共同的初始化代码,这就会导致代码冗余。委托构造函数解决了这个问题,让一个构造函数可以重用其他构造函数的初始化代码。
委托构造函数的语法非常简单,就是在构造函数的初始化列表中使用其他构造函数的调用。具体来说,委托构造函数的语法如下:
class ClassName {
public:ClassName(参数列表) : 构造函数调用 {// 初始化代码}
};
在上面的语法中,构造函数调用就是委托给其他构造函数的调用。
使用委托构造函数的一些注意事项:
- 委托构造函数只能在初始化列表中调用,不能在构造函数的函数体内部调用。
- 委托构造函数的调用必须放在构造函数的初始化列表的最开始。
- 一个类可以有多个委托构造函数,它们之间可以相互调用。
- 如果委托构造函数没有给出初始化列表,那么默认会调用隐式的默认构造函数。
- 委托构造函数的调用顺序和委托的顺序无关,只与初始化列表中的顺序有关。
3.实例
v1.0
#include <iostream>
#include <string>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;
}
打印:
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 <iostream>
#include <string>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;
}
总结
- SurfaceFlinger(std::string service_name, int num)函数将service_name通过构造函数列表传递给被调用的构造函数SurfaceFlinger(service_name)
- 被委托构造函数SurfaceFlinger(std::string &service_name): Fname(service_name)将service_name传给成员变量Fname。