C++中包含初始化列表的构造函数
构造函数对初始化成员变化很有用。另一种初始化成员的方式是使用初始化列表。对于程序中接受两个参数的构造函数,其包含初始化列表的变种类似于下面这样:
class Human
{
private:
string name;
int age;
public:
// two parameters to initialize members age and name
Human(string humansName, int humansAge)
:name(humansName), age(humansAge)
{
cout << "Constructed a human called " << name;
cout << ", " << age << " years old" << endl;
}
// ... other class members
};
格式为:
:成员变量1(参数1),成员变量2(参数2)
编译器会将初始化列表一一转换成代码,并将这些代码放在用户编写的代码之前。
初始化列表的效果:
在类定义中声明成员变量时,不建议使用初始化语句进行初始化(例如 int x = 0),因为这种初始化方式将在构造函数调用之前执行,可能会导致其他部分的代码不能引用该成员变量的问题。初始化列表的方式是一种更好的初始化数据成员的方式,因为它将初始化操作与构造函数调用分开,可以保证成员变量的正确使用。使用初始化列表可以提高程序的效率和可读性,因为它可以避免在构造函数体中进行初始化,从而减少了构造函数的执行时间。使用初始化列表还可以确保各个成员变量被正确地初始化,从而避免因未初始化导致的错误。
初始化列表由包含在括号中的参数声明后面的冒号标识,冒号后面列出了各个成员变量及其初始值。初始值可以是参数(如 humansName),也可以是固定的值。使用特定参数调用基类的构造函数时,初始化列表也很有用。
何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。 代码如下:struct foo{ string name ; int id ; foo(string s, int i):name(s), id(i){} ; // 初始化列表};构造函数的两个执行阶段构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段。
在以下示例程序中, Human 类包含一个带初始化列表的默认构造函数,该默认构造函数的参数都有默认值:
#include <iostream>
#include <string>
using namespace std;
class Human
{
private:
int age;
string name;
public:
Human(string humansName = "Adam", int humansAge = 25)
:name(humansName), age(humansAge)
{
cout << "Constructed a human called " << name;
cout << ", " << age << " years old" << endl;
}
};
int main()
{
Human adam;
Human eve("Eve", 18);
return 0;
}
输出:
Constructed a human called Adam, 25 years old
Constructed a human called Eve, 18 years old
分析:
第 11~16 行的构造函数包含初始化列表,且用于设置 name 和 age 的参数分别包含默认值“Adam” 和 25。因此,第 21 行创建 Human 类的实例 adam 时,由于没有提供参数值,所以自动将默认值赋给了其成员;而第 22 行创建 eve 时提供了参数值,所以这些值将分别赋给 Human::name 和 Human::age。
注意:
也可使用关键字 constexpr 将构造函数定义为常量表达式。在有助于提高性能的情况下,
可在构造函数的声明中使用这个关键字,如下所示:
class Sample
{
const char* someString;
public:
constexpr Sample(const char* input)
:someString(input)
{ // constructor code }
};
该文章会更新,欢迎大家批评指正。文章来源:https://www.toymoban.com/news/detail-743330.html
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程文章来源地址https://www.toymoban.com/news/detail-743330.html
到了这里,关于C++中包含初始化列表的构造函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!