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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++类与结构体构造函数详细相关理解整理
说到构造函数,通常是将讲对象创建时编译器⾃动调⽤构造函数为对象初始化,也可以说是分配内存空间。

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

这⾥主要说下类与结构体的差异/类与结构体包含继承关系时的构造调⽤/类的初始化列表/默认构造函数/拷贝构造函数以及牵涉到的相关内容
结构体和类的区别
对于结构中的实例字段成员,不能在声明时赋值初始化
声明了结构类型后,可以使⽤new运算符创建构造对象,也可以不⽤new。

若不⽤new,那在初始化所有字段之前,字段将
保持未赋值状态且对象不可⽤
结构在堆栈中创建,是值类型,⽽类是引⽤类型
值类型和引⽤类型的区别
byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。

值类型变量声明后,不管是否已经
赋值,编译器为其分配内存
string 和 class统称为引⽤类型。

当声明⼀个类时,只在栈中分配⼀⼩⽚内存⽤于容纳⼀个地址,⽽此时并没有为其分配堆
上的内存空间。

当使⽤ new 创建⼀个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的⼩⽚空间中注:new 的位置可以堆可以栈?如何查看具体的位置呢? --- linux
'在linux⽬录下:cat /proc/pid/maps查看'
最后⼀项是映射的⽂件名。

对匿名映射来说,是此段虚拟内存在进程中的⾓⾊。

[stack]表⽰在进程中作为栈使⽤,[heap]表⽰堆。

其余情
况则⽆显⽰第⼀个⽰例可以确认的是new的数据此时并不在堆数据区中/ then……
实际上应该在哪呢?——待确认【==|`】
结构体与类的构造函数--包含&继承关系下是否会有差异呢?
他们之间的调⽤初始化关系:初始化会分配空间和赋随机值
⽰例:-(S=Struct C=Class Con=Conntain Inher=Inherit)
结论:不论包含还是继承都会调⽤相关的构造函数,不⽤多次给成员初始化处理
构造函数相关---调⽤构造函数的顺序
此处需要使⽤单步调试确认顺序(VS2017 使⽤F10调试)
包含关系中,按照成员声明的顺序进⾏构造初始化,⽽不是按照初始化列表的顺序初始化
继承关系中,先调⽤⽗类的构造,再按照声明的顺序
初始化列表 & 默认构造函数 & 静态构造函数 & 拷贝构造函数
需使⽤初始化列表的条件:
数据成员是对象,并且这个对象只有含参数的构造函数,没有⽆参数的构造函数
对象引⽤或者cosnt修饰的数据成员
⼦类初始化⽗类的私有成员,需要在(并且也只能在)参数初始化列表中显⽰调⽤⽗类的构造函数
默认构造函数:
1. 没有带明显形参的构造函数。

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

warning: 编译器⾃动合成默认构造函数的误区
1. 合成默认构造函数总是不会初始化类的内置类型及复合类型的数据成员。

(如 int / bool ……)
2. 分清楚默认构造函数被程序需要与被编译器需要,只有被编译器需要的默认构造函数,编译器才会合成它
编译器需要去合成默认构造的条件:
含有类对象数据成员,该类对象类型有默认构造函数
基类带有默认构造函数的派⽣类
带有虚函数的类
带有虚基类的类
静态构造函数
1.静态构造函数既没有访问修饰符,也没有参数
2.在创建第⼀个实例或引⽤任何静态成员之前,将⾃动调⽤静态构造函数来初始化类
3.⽆法直接调⽤静态构造函数
4.在程序中,⽤户⽆法控制何时执⾏静态构造函数
拷贝构造函数
⼀种特殊的构造函数,函数的名称必须和类名称⼀致,它必须的⼀个参数是本类型的⼀个引⽤变量。

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

相关文档
最新文档