【校招面试 之 C/C++】第1题 为什么优先使用构造函数的初始化列表
2024-10-19 13:32:21
1.首先看一个例子:
#include<iostream>
using namespace std; class Test1
{
public:
Test1() // 无参构造函数
{
cout << "Construct Test1" << endl ;
} Test1(const Test1& t1) // 拷贝构造函数
{
cout << "Copy constructor for Test1" << endl ;
this->a = t1.a ;
}
private:
int a ;
}; class Test2
{
public:
Test1 test1 ;
// 情形1:不使用初始化参数列表
//Test2(Test1 &t1)
//{
// test1 = t1 ;
//} // 情形2:使用初始化参数列表
Test2(Test1 &t1):test1(t1){}
};
int main(){
Test1 t1;
Test2 t2(t1);
system("pause");
return 0;
}
情形1输出:
情形2输出:
第二种情况输出对应Test2的初始化列表,直接调用拷贝构造函数初始化test1,省去了调用默认构造函数的过程。所以一个好的原则是,能使用初始化列表的时候尽量使用初始化列表。提高了性能。
2. 除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表。
- 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
- 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
- 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。
对于没有默认构造函数的类,我们看一个例子。
struct Test1
{
Test1(int a):i(a){}
int i ;
}; struct Test2
{
Test1 test1 ;
Test2(Test1 &t1)
{
test1 = t1 ;
}
};
以上代码无法通过编译,因为Test2类中Test1 test1;需要调用默认的构造函数,但是Test1类没有无参的构造函数,但是由于Test1没有默认的构造函数,故而编译错误。正确的代码如下,使用初始化列表代替赋值操作。
struct Test2
{
Test1 test1 ;
Test2(Test1 &t1):test1(t1){}
}
成员变量的初始化顺序
成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的,看代码。
struct foo
{
int i ;
int j ;
foo(int x):i(x), j(i){}; // ok, 先初始化i,后初始化j
};
最新文章
- Node.js系列基础学习----安装,实现Hello World, REPL
- 【Vijos】1431 守望者的逃离
- 《Head First 设计模式》ch.1 策略(Strategy)模式
- 解开发者之痛:中国移动MySQL数据库优化最佳实践(转)
- java常见机试题目(1)
- zabbix邮件报警脚本
- 移动端H5页面之iphone6的适配
- Android中Broadcast Receiver组件具体解释
- FTP服务添加用户及设置权限
- C#中AES加密和解密
- c#XML操作类的方法总结
- tensorflow l2_normalize函数
- C# 异步转同步
- 在Net MVC中应用JsTree
- 零基础学Python--------第4章 序列的应用
- BZOJ2229[Zjoi2011]最小割——最小割树
- lvs - mask标记
- [Understanding] Compressive Sensing and Deep Model
- js正则表达式子校验
- 【SpringBoot系列2】SpringBoot整合Redis