[编程语言][C++]类成员变量初始化之坑
创始人
2024-05-01 21:37:23
0

类成员变量初始化之坑

  • 问题描述
  • 总结

问题描述

按照经验,设计一个类时需要对成员变量进行初始化。C++提供了两种初始化成员变量的途径,让程序员有了一些的选择空间。同时,这也给程序员留下了坑。

初始化类成员变量的途径:

  1. 在定义成员变量时初始化
  2. 在初始化成员列表中初始化

据此,设计以下代码:

#include using namespace std::literals;std::string generate_name_1()
{std::cout << "Calling generate_name_1() ..." << std::endl;return "Alex"s;
}std::string generate_name_2()
{std::cout << "Calling generate_name_2() ..." << std::endl;return "Brant"s;
}std::string generate_name_3()
{std::cout << "Calling generate_name_3() ..." << std::endl;return "Chris"s;
}class person_1
{
public:person_1() = default;std::string name() const { return m_name; }private:std::string m_name{ generate_name_1() };
};class person_2
{
public:person_2() :m_name{ generate_name_2() } {}std::string name() const { return m_name; }private:std::string m_name;
};class person_3
{
public:person_3() :m_name{ generate_name_2() } {}std::string name() const { return m_name; }private:std::string m_name{ generate_name_1() };
};class person_4
{
public:person_4() :m_name{ generate_name_2() }{m_name = generate_name_3();}std::string name() const { return m_name; }private:std::string m_name{ generate_name_1() };
};int main()
{std::cout << "===== class person_1 =====" << std::endl;person_1 person1;std::cout << person1.name() << std::endl;std::cout << std::endl;std::cout << "===== class person_2 =====" << std::endl;person_2 person2;std::cout << person2.name() << std::endl;std::cout << std::endl;std::cout << "===== class person_3 =====" << std::endl;person_3 person3;std::cout << person3.name() << std::endl;std::cout << std::endl;std::cout << "===== class person_4 =====" << std::endl;person_4 person4;std::cout << person4.name() << std::endl;std::cout << std::endl;return EXIT_SUCCESS;
}

上述代码的运行结果如下:

===== class person_1 =====
Calling generate_name_1() ...
Alex===== class person_2 =====
Calling generate_name_2() ...
Brant===== class person_3 =====
Calling generate_name_2() ...
Brant===== class person_4 =====
Calling generate_name_2() ...
Calling generate_name_3() ...
Chris

我们看到:

  1. 如果定义成员变量时初始化,则使用此处的初始化值
  2. 如果在初始化成员列表中初始化,则使用此处的初始化值
  3. 如果定义成员变量时初始化,并且同时在初始化成员列表中初始化,则定义成员变量时的初始化被忽略
  4. 如果在构造函数的函数体内给成员变量赋值,则该已被初始化的成员变量的值在此处被赋值。

总的来说就是:赋值会覆盖初始化值,初始化成员列表中的初始化会覆盖定义成员变量时的初始化。

总结

  1. 最好对所有的类成员变量进行初始化,以防止其值处于不确定的状态。
  2. 基础且通用的初始化值应该在定义类成员变量时进行初始化,而较为特殊的初始化值应该在构造函数的初始化成员列表中进行初始化。
  3. 最好不要在构造函数中,试图通过赋值的方式对成员变量进行初始化。因为这样会多出赋值的过程,降低程序的性能。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...