搬: 含有对象成员指针的类的对象成员指针初始化问题
含有对象成员指针的类的对象成员指针初始化问题 [问题点数:20分,结帖人papaweilun]
https://bbs.****.net/topics/392257006
结帖率 66.67%
为什么这个类中的两个coordinate的对象指针,可以在Line的构造函数里面初始化,在我看来,不应该在初始化列表中进行初始化吗?事实上两种方法都可以,我想弄明白。。。。。。
0 2017-08-31 23:05:55
你需要明白的是
为什么要进行初始化?
不初始化可以么?
而不是在哪里初始化
指针一般在使用之前初始化就可以了
在哪里不都一样么
0 2017-08-31 23:18:49
类的成员变量在类的初始化列表中初始化和在构造函数中赋值是有区别的。如果没有在构造函数的初始值列表中显式地初始化成员,则成员将在构造题函数执行前执行默认初始化。如果在Line类的构造函数内部对m_pCoorA和m_pCoorB进行赋值,实际上对这两个变量先进行了默认初始化,然后再赋值,效率比直接在初始值列表中要低。
对于自定义类的指针初始化的时机,个人觉得在初始值列表和再构造函数内部都可以。
0 2017-09-01 06:16:27
引用 2 楼 hou09tian 的回复:
类的成员变量在类的初始化列表中初始化和在构造函数中赋值是有区别的。如果没有在构造函数的初始值列表中显式地初始化成员,则成员将在构造题函数执行前执行默认初始化。如果在Line类的构造函数内部对m_pCoorA和m_pCoorB进行赋值,实际上对这两个变量先进行了默认初始化,然后再赋值,效率比直接在初始值列表中要低。
对于自定义类的指针初始化的时机,个人觉得在初始值列表和再构造函数内部都可以。
此为正解。
构造函数的初始值列表,是真正初始化类成员的地方,如果没有显式地初始化成员,那么编译器会在构造函数执行前生成默认初始化成员的代码。
而构造函数里写m_pCoorA = 某某,调用的是赋值函数。
0 2017-09-01 08:35:06
引用 2 楼 hou09tian 的回复:
类的成员变量在类的初始化列表中初始化和在构造函数中赋值是有区别的。如果没有在构造函数的初始值列表中显式地初始化成员,则成员将在构造题函数执行前执行默认初始化。如果在Line类的构造函数内部对m_pCoorA和m_pCoorB进行赋值,实际上对这两个变量先进行了默认初始化,然后再赋值,效率比直接在初始值列表中要低。
对于自定义类的指针初始化的时机,个人觉得在初始值列表和再构造函数内部都可以。
因为我之前学习到了,如果Line这个类里面有两个Coordinate这样子的对象成员,是一定要使用初始化列表的,因为通过调用构造函数会发现两个Coordinate对象成员会在实例化Line这个对象之前先被实例化
例如
Line L1
会发现L1里面的两个Coordinate会先被实例化再到Line被实例化
所以我就觉得指针应该也是这样子。。。。。。
0 2017-09-01 09:14:55
构造函数的初始化列表初始化 和 构造函数的函数体内赋值
都属于类对象的初始化。
但是两者有些许区别,在初始化列表中进行初始化才是真正意义的初始化,也就是成员在定义的时候就进行了初始化。
而在函数体里面进行赋值,在执行函数体内的语句之前,指针值是不确定的,而对其赋值之后才有一个确定值。
就指针(或者内置类型)来说性能方面的差异几乎可以忽略。但是对于自定义类型,这两种方式的性能上差异会比较明显
假设有一个自定义类型的对象 A m_a;
因为如果在函数体内赋值,那么编译器会在初始化(真正意义上的初始化)调用A的默认构造函数先进行一次初始化。
之后再赋值一次(即给定的赋值语句),性能上就有所损失(毕竟多做了一些事情)
另外,假如A没有提供默认构造函数的情况下(这里不考虑C++11新增的{}统一类内初始化的情况)
那么必须在初始化列表进行初始化,这是为什么呢?根据前面我讲述的你自己思考下答案。
0 2017-09-01 16:05:22
版主
引用 4 楼 papaweilun 的回复:
Quote: 引用 2 楼 hou09tian 的回复:类的成员变量在类的初始化列表中初始化和在构造函数中赋值是有区别的。如果没有在构造函数的初始值列表中显式地初始化成员,则成员将在构造题函数执行前执行默认初始化。如果在Line类的构造函数内部对m_pCoorA和m_pCoorB进行赋值,实际上对这两个变量先进行了默认初始化,然后再赋值,效率比直接在初始值列表中要低。对于自定义类的指针初始化的时机,个人觉得在初始值列表和再构造函数内部都可以。因为我之前学习到了,如果Line这个类里面有两个Coordinate这样子的对象成员,是一定要使用初始化列表的,因为通过调用构造函数会发现两个Coordinate对象成员会在实例化Line这个对象之前先被实例化例如Line L1会发现L1里面的两个Coordinate会先被实例化再到Line被实例化所以我就觉得指针应该也是这样子。。。。。。
首先,你这里只不过是指针,而不是对象
其次不明白你说的意思
0 2017-09-01 21:45:45
类指针而已,在哪初始化不一样?另外,基类和类成员要在初始化列表去初始化,否则在进入构造函数之前会先调用他们的默认构造函数初始化这些类,而指针不存在这种问题