热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c/c++开发分享详解C++构造函数

目录1.作用2.代码举例2.1示例1:2.2示例2:3.使用3.1使用构造函数初始化3.2有参数的构造函数3.3默认的构造函数4.成员初始化列表例1:正常初始化例2:
目录
  • 1.作用
  • 2.代码举例
    • 2.1 示例1:
    • 2.2 示例2:
  • 3. 使用
    • 3.1 使用构造函数初始化
    • 3.2 有参数的构造函数
    • 3.3 默认的构造函数
  • 4. 成员初始化列表
    • 例1:正常初始化
    • 例2:成员初始化列表
    • 为啥推荐成员初始化列表的写法?
  • 总结

    %ignore_a_1%

    1.作用

    一种特殊类型的方法,在每次实例化对象时运行

    2.代码举例

    2.1 示例1:

      #include   class a  {      public:          float a, b;          void print()          {              std::cout <
    

    运行结果:

    详解C++构造函数

    当我们实例化a,系统为它分配内存,我们没有初始化内存,得到的是内存空间原有的那些东西

    2.2 示例2:

    当在main中添加 std::cout <

      int main()  {      a a;      std::cout <
    

    (ubuntu下 vs code )运行结果

    详解C++构造函数

    不同编译器可能不一样,有的会编译不过报错(未初始化局部变量),原因有待深入…

    3. 使用

    3.1 使用构造函数初始化

      #include   class a  {      public:          float a, b;          a ()          {              a = 0.0f;              b = 0.0f;          }          void print()          {              std::cout <
    

    结果:

    详解C++构造函数

    3.2 有参数的构造函数

      #include   class a  {      public:          float a, b;      // 无参构造      a ()          {              a = 0.0f;              b = 0.0f;          }      // 有参构造          a(float c,float d)          {              a = c;              b = d;          }                void print()          {              std::cout <
    

    一个类可以有很多构造函数 前提是参数个数不同或者参数类型不同

    类似于同名函数(函数重载 即有相同的函数名,但是有不同的参数个数与参数类型)

       a(float c,float d)   {   }  a(int c,int d)  {  }  a(float c,float d,float e)  {  }  

    这里需要注意有参构造的时候注意传值类型

    float 类型

      a a(5.0f , 6.0f);  

    3.3 默认的构造函数

    每个类默认有一个空参空实体的构造函数(如果写了构造函数,则默认构造函数就没有了,需要时需手动添加)

      a ()  {  }  

    如果不想使用构造函数有两种方法

      // 1 私有化  private :  	a(){}  // 2 删掉  a() = delete;  

    4. 成员初始化列表

    例1:正常初始化

      #include   using namespace std;  class student  {  private:      const char *m_name;      int m_age;      float m_score;  public:      // 无参构造 给变量赋定值      student()      {          m_name = "aaa";          m_age = 1;          m_score = 99.0;      }      // 有参构造  给变量动态赋值      student(const char *name, int age, float score)      {          m_name = name;          m_age = age;          m_score = score;      }      void print ()      {          cout <
    

    例2:成员初始化列表

      #include   #include   using namespace std;  class student  {  private:      // string m_name;      // char *m_name;      const char *m_name;      int m_age;      float m_score;  public:         //  无参 成员初始化列表        student()           : m_name("bbb") , m_age(2) , m_score(93.0f)       {          // todo      }      // 有参 成员初始化列表        /**       *  const char *name    常量指针     const 修饰*name   *name不可改变       *  char * const name   指针常量     const 修饰 name   name不可改变       *  char const *name    常量指针 等同于 const char *name        *        *  这里不写const 会报警告  但可以编过         *        */      student(const char *name, int age, float score)          : m_name(name) , m_age(age) , m_score(score)      {         // todo      }      void print ()      {          cout <
    

    运行结果都一样:

    aaa ,1 ,99
    ccc ,2 ,99.3

    使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。

    初始化列表可以用于全部成员变量,也可以只用于部分成员变量

      student(char *name, int age, float score): m_name(name){      m_age = age;      m_score = score;  }  

    note:成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。

    为啥推荐成员初始化列表的写法?

      #include   using namespace std;  class example  {  public:      example()      {          cout<<"create example" <
    

    结果:

    详解C++构造函数

    a的构造函数换成成员初始化列表的写法

      //    a() : m_name ("name"),m_example(example(1))  		与下面写法相同  a() : m_name ("name"),m_example(1)      {      }  

    结果:

    详解C++构造函数

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注<编程笔记>的更多内容!

    需要了解更多c/c++开发分享详解C++构造函数,都可以关注C/C++技术分享栏目—编程笔记


    推荐阅读
    • 成功安装Sabayon Linux在thinkpad X60上的经验分享
      本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
    • 向QTextEdit拖放文件的方法及实现步骤
      本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
    • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
    • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
    • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
    • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
    • CF:3D City Model(小思维)问题解析和代码实现
      本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
    • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
    • 开发笔记:实验7的文件读写操作
      本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
    • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
    • 31.项目部署
      目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
    • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
    • c语言\n不换行,c语言printf不换行
      本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
    • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
    • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
    author-avatar
    2449978963潇潇
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有