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


    推荐阅读
    • 利用 Calcurse 在 Linux 终端高效管理日程与任务
      对于喜爱使用 Linux 终端进行日常操作的系统管理员来说,Calcurse 提供了一种强大的方式来管理日程安排、待办事项及会议。本文将详细介绍如何在 Linux 上安装和使用 Calcurse,帮助用户更有效地组织工作。 ... [详细]
    • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
    • Web动态服务器Python基本实现
      Web动态服务器Python基本实现 ... [详细]
    • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
    • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
    • linux网络子系统分析(二)—— 协议栈分层框架的建立
      目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
    • 本文介绍了如何在不同操作系统上安装Git,以及一些基本和高级的Git操作,包括项目初始化、文件状态检查、版本控制、分支管理、标签处理、版本回退等,并简要提及了开源许可协议的选择。 ... [详细]
    • 根据官方定义,RxJava是一种用于异步编程和可观察数据流的API。其核心特性在于流式处理能力和丰富的操作符支持。 ... [详细]
    • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
    • Python 日志记录模块详解
      日志记录机制是软件开发中不可或缺的一部分,它帮助开发者追踪和调试程序运行时的各种异常。Python 提供了内置的 logging 模块,使我们在代码中记录和管理日志信息变得更加方便。本文将详细介绍如何使用 Python 的 logging 模块。 ... [详细]
    • 电商高并发解决方案详解
      本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
    • 从CodeIgniter中提取图像处理组件
      本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
    • Android与JUnit集成测试实践
      本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
    • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
    • 本文提供了一个使用C语言实现的顺序表区间元素删除功能的完整代码示例。该程序首先初始化一个顺序表,然后根据用户输入的数据进行插入操作,最后根据指定的区间范围删除相应的元素,并输出最终的顺序表。 ... [详细]
    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社区 版权所有