C++ 类与结构体 构造函数 详细相关理解整理

Wesley13
• 阅读 731

说到构造函数,通常是将讲对象创建时编译器自动调用构造函数为对象初始化,也可以说是分配内存空间。

 学习了构造函数 相对其中牵涉到的一些点作下大概的了解和学习,整理一下只是点。


这里主要说下  类与结构体的差异/类与结构体包含继承关系时的构造调用/类的初始化列表/默认构造函数/拷贝构造函数以及牵涉到的相关内容

结构体和类的区别

  • 对于结构中的实例字段成员,不能在声明时赋值初始化

  • 声明了结构类型后,可以使用new运算符创建构造对象,也可以不用new。若不用new,那在初始化所有字段之前,字段将保持未赋值状态且对象不可用

  • 结构在堆栈中创建,是值类型,而类是引用类型

值类型和引用类型的区别

  • byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存

  • string 和 class统称为引用类型。当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中

    注:new 的位置可以堆可以栈?如何查看具体的位置呢? --- linux

    '在linux目录下:cat /proc/pid/maps查看'

     C++ 类与结构体  构造函数 详细相关理解整理

    C++ 类与结构体  构造函数 详细相关理解整理

    最后一项是映射的文件名。对匿名映射来说,是此段虚拟内存在进程中的角色。[stack]表示在进程中作为栈使用,[heap]表示堆。其余情况则无显示 第一个示例可以确认的是new的数据此时并不在堆数据区中/  then……

    实际上应该在哪呢?——待确认【==|`】

结构体与类的构造函数--包含&继承  关系下是否会有差异呢?

他们之间的调用初始化关系:  初始化会分配空间和赋随机值

示例:-(S=Struct C=Class Con=Conntain Inher=Inherit)

C++ 类与结构体  构造函数 详细相关理解整理

结论:不论包含还是继承 都会调用 相关的构造函数,不用多次给成员初始化处理

构造函数相关---调用构造函数的顺序

此处需要使用单步调试确认顺序 (VS2017 使用F10调试)

  • 包含关系中,按照成员声明的顺序进行构造初始化,而不是按照初始化列表的顺序初始化

  • C++ 类与结构体  构造函数 详细相关理解整理

  • 继承关系中,先调用父类的构造 ,再按照声明的顺序

  • C++ 类与结构体  构造函数 详细相关理解整理

初始化列表 & 默认构造函数 & 静态构造函数 & 拷贝构造函数

需使用初始化列表的条件:

  • 数据成员是对象,并且这个对象只有含参数的构造函数,没有无参数的构造函数

  • 对象引用或者cosnt修饰的数据成员

  • 子类初始化父类的私有成员,需要在(并且也只能在)参数初始化列表中显示调用父类的构造函数

    C++ 类与结构体  构造函数 详细相关理解整理

默认构造函数:csdn什么是默认构造函数
  1. 没有带明显形参的构造函数。

  2. 提供了默认实参的构造函数。

warning: 编译器自动合成默认构造函数的误区

  1. 合成默认构造函数总是不会初始化类的内置类型及复合类型的数据成员。(如 int / bool ……)

  2. 分清楚默认构造函数被程序需要与被编译器需要,只有被编译器需要的默认构造函数,编译器才会合成它

    编译器需要去合成默认构造的条件:

    • 含有类对象数据成员,该类对象类型有默认构造函数

    • 基类带有默认构造函数的派生类

    • 带有虚函数的类

    • 带有虚基类的类

静态构造函数

1.静态构造函数既没有访问修饰符,也没有参数

2.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类

3.无法直接调用静态构造函数

4.在程序中,用户无法控制何时执行静态构造函数

拷贝构造函数详解

一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个**引用变量**。

作用就是用来复制对象的,在使用这个对象的实例来初始化这个对象的一个新的实例

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
C++中构造函数和析构函数
构造函数定义它是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。另外,一个类可以有多个构造函数,我们可以根据其参数个数的不同或参数类型的不同来区分它们(这就是构造函数的重载)特点1.构造函数的命名必须和类名完全相同;2.构造函数的功能主要用于在类的对象创建时定义
Wesley13 Wesley13
3年前
C++构造函数详解(复制构造函数 也是 拷贝构造函数)
构造函数是干什么的该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员。构造函数的种类!复制代码(https://oscimg.oschina.net/oscnet/54a3f729e89451abb86a0bec4639
Wesley13 Wesley13
3年前
Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行。执行顺序优先级:静态块,main(),构造块,构造方法。构造函数publicHelloA(){//构造函数}关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造
Wesley13 Wesley13
3年前
VC++知识点整理
1.内联函数定义:定义在类体内的成员函数,即函数的函数体放在类体内特点:在调用处用内联函数体的代码来替换,用于解决程序的运行效率问题。一定要在调用之前定义,并且内联函数无法递归调用。2.构造函数与析构函数构造函数:用于为对象分配内存空间,对类的成员变量进行初始化,并执行其他内部管理操作。可以接受参
小万哥 小万哥
10个月前
C# 面向对象编程进阶:构造函数详解与访问修饰符应用
C构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C服务器创建一个构造函数:csharp//创建一个Car类classCarpublicstringmodel;//创
小万哥 小万哥
10个月前
Java 构造函数与修饰符详解:初始化对象与控制权限
Java构造函数Java构造函数是一种特殊的类方法,用于在创建对象时初始化对象的属性。它与类名相同,并且没有返回值类型。构造函数的作用:为对象的属性设置初始值执行必要的初始化操作提供创建对象的多种方式构造函数的类型:默认构造函数:无参数的构造函数,如果用户
小万哥 小万哥
8个月前
C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
C构造函数构造函数是C中一种特殊的成员函数,当创建类对象时自动调用。它用于初始化对象的状态,例如为属性分配初始值。构造函数与类同名,且没有返回值类型。构造函数类型C支持多种类型的构造函数,用于满足不同的初始化需求:默认构造函数:不带参数的构造函