类成员初始化的两种方法,const,static类成员的初始化

类成员初始化的两种方法,const,static类成员的初始化

我们已经知道可以用构造函数里的代码来初始化对象,这就是我们要用的第一种初始化方式

第一种初始化方式

#include<bits/stdc++.h> using namespace std; class Entity { private: string m_name; public: Entity() { m_name = "Unknown"; } Entity(const string &name) { m_name = name; } string Get_name() const { return m_name; } }; int main() { Entity e0; cout << e0.Get_name() << endl; Entity e1("xiao ming"); cout << e1.Get_name() << endl; }

可以发现代码里的构造函数里规定了m_named的值,但如果变量变多,并且要在构造函数里添加函数的话。第一种未免有点繁琐了(对于观看者来讲)像:

Entity() { a=0; b=0; m_name = "Unknown"; Init(); Display(); }

这样在构造函数里面既有函数,又要初始化,会显得杂乱,另外还有一个严重的问题,后面会讲到。

所以出现了第二种初始化方式

第二种初始化方式

Entity() :m_name("Unknown") { } Entity(const string &name):m_name(name) { }

这种构造函数后面加冒号的行为来进行初始化,有下面个好处

  1. 代码整洁自然不用说

  2. 节约内存空间,防止多次构造函数。

    为什么这么说,直接看代码!

    #include<bits/stdc++.h> using namespace std; class Example { private: public: Example() { std::cout << "Created Entity!" << endl; } Example(int x) { std::cout << "Created Entity with " << x <<"!"<< endl; } }; class Entity { private: string m_name; Example m_example; public: Entity(){ m_name = std::string("Unknown"); m_example=Example(8); }//重点看这里 Entity(const string &name):m_name(name) { } string Get_name() const { return m_name; } }; int main() { Entity e0; cout << e0.Get_name() << endl; }

结果为:

Created Entity! Created Entity with 8! Unknown

看出蹊跷了,他在我们不知道的情况下多生成了默认构造函数,这并不是我们想要的。

这是因为,我们多创立了一个空间来容纳对example的二次初始化。

我们的目的是扔掉它,用一个新的对象覆它,我们创建了两个对象,而不是一个

这时应该这样

Entity():m_example(Example(8)) { m_name = std::string("Unknown"); }

或者

Entity():m_example(8) { m_name = std::string("Unknown"); }

此时的结果为:

Created Entity with 8! Unknown

另外冒号标识符非常重要的作用有下面:

以下参考[类的常量成员的初始化]((7条消息) 类的常量成员的初始化_类中常量成员初始化_chengonghao的博客-CSDN博客)

类的成员的初始化:

  1. 非static非const成员变量,必须在构造函数中进行初始化;

  2. static成员变量,必须在类的外面进行初始化;

  3. const成员变量,必须在类的构造函数的初始化列表中初始化;

  4. static const成员变量,可以在类的内部声明时初始化。

    class A { const int Size = 0; }

    这里会报错,常量成员不能在类中声明的地方初始化,因为此时类并没有进行实例化(创建对象),因此并没有分配内存,不能进行初始化。

上述示例应该写成:

class A { public: const int Size; A() : Size(0){} }

类常量成员初始化

#include<iostream> class Circle { public: const double rad; Circle(const double w_rad) :rad(w_rad){}

嗯,以上就是全部喽 😄


__EOF__

本文作者Drip
本文链接https://www.cnblogs.com/drip3775/p/17311608.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   笠大  阅读(462)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示