热门标签 | 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++技术分享栏目—编程笔记


    推荐阅读
    • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
    • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
    • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
    • 本文详细介绍了C++中map容器的多种删除和交换操作,包括clear、erase、swap、extract和merge方法,并提供了完整的代码示例。 ... [详细]
    • Nginx 反向代理与负载均衡实验
      本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
    • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
    • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
    • 使用Nginx反向代理实现多域名端口映射
      本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
    • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
    • 在PHP后端开发中遇到一个难题:通过第三方类文件发送短信功能返回的JSON字符串无法解析。本文将探讨可能的原因并提供解决方案。 ... [详细]
    • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
    • 深入解析Spring启动过程
      本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
    • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
      本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
    • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
    • 2017-2018年度《网络编程与安全》第五次实验报告
      本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
    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社区 版权所有