含有对象成员指针的类的对象成员指针初始化问题 [问题点数:20分,结帖人papaweilun]

https://bbs.csdn.net/topics/392257006

  • 收藏帖子
  • 回复

hereIambabe

结帖率 66.67%


为什么这个类中的两个coordinate的对象指针,可以在Line的构造函数里面初始化,在我看来,不应该在初始化列表中进行初始化吗?事实上两种方法都可以,我想弄明白。。。。。。

0 2017-08-31 23:05:55

回复数 7 只看楼主 引用 举报 楼主

das白

你需要明白的是
为什么要进行初始化?
不初始化可以么?
而不是在哪里初始化
指针一般在使用之前初始化就可以了
在哪里不都一样么

0 2017-08-31 23:18:49

只看TA 引用 举报 #1    得分 0

棉猴

类的成员变量在类的初始化列表中初始化和在构造函数中赋值是有区别的。如果没有在构造函数的初始值列表中显式地初始化成员,则成员将在构造题函数执行前执行默认初始化。如果在Line类的构造函数内部对m_pCoorA和m_pCoorB进行赋值,实际上对这两个变量先进行了默认初始化,然后再赋值,效率比直接在初始值列表中要低。
对于自定义类的指针初始化的时机,个人觉得在初始值列表和再构造函数内部都可以。

0 2017-09-01 06:16:27

只看TA 引用 举报 #2    得分 0

迷失丶心

引用 2 楼 hou09tian 的回复:

类的成员变量在类的初始化列表中初始化和在构造函数中赋值是有区别的。如果没有在构造函数的初始值列表中显式地初始化成员,则成员将在构造题函数执行前执行默认初始化。如果在Line类的构造函数内部对m_pCoorA和m_pCoorB进行赋值,实际上对这两个变量先进行了默认初始化,然后再赋值,效率比直接在初始值列表中要低。
对于自定义类的指针初始化的时机,个人觉得在初始值列表和再构造函数内部都可以。

此为正解。

构造函数的初始值列表,是真正初始化类成员的地方,如果没有显式地初始化成员,那么编译器会在构造函数执行前生成默认初始化成员的代码。

而构造函数里写m_pCoorA = 某某,调用的是赋值函数。

0 2017-09-01 08:35:06

只看TA 引用 举报 #3    得分 0

hereIambabe

引用 2 楼 hou09tian 的回复:

类的成员变量在类的初始化列表中初始化和在构造函数中赋值是有区别的。如果没有在构造函数的初始值列表中显式地初始化成员,则成员将在构造题函数执行前执行默认初始化。如果在Line类的构造函数内部对m_pCoorA和m_pCoorB进行赋值,实际上对这两个变量先进行了默认初始化,然后再赋值,效率比直接在初始值列表中要低。
对于自定义类的指针初始化的时机,个人觉得在初始值列表和再构造函数内部都可以。

因为我之前学习到了,如果Line这个类里面有两个Coordinate这样子的对象成员,是一定要使用初始化列表的,因为通过调用构造函数会发现两个Coordinate对象成员会在实例化Line这个对象之前先被实例化
例如
Line L1
会发现L1里面的两个Coordinate会先被实例化再到Line被实例化
所以我就觉得指针应该也是这样子。。。。。。

0 2017-09-01 09:14:55

只看TA 引用 举报 #4    得分 0

幻夢之葉

构造函数的初始化列表初始化 和 构造函数的函数体内赋值
都属于类对象的初始化。

但是两者有些许区别,在初始化列表中进行初始化才是真正意义的初始化,也就是成员在定义的时候就进行了初始化。
而在函数体里面进行赋值,在执行函数体内的语句之前,指针值是不确定的,而对其赋值之后才有一个确定值。

就指针(或者内置类型)来说性能方面的差异几乎可以忽略。但是对于自定义类型,这两种方式的性能上差异会比较明显
假设有一个自定义类型的对象 A m_a;
因为如果在函数体内赋值,那么编译器会在初始化(真正意义上的初始化)调用A的默认构造函数先进行一次初始化。
之后再赋值一次(即给定的赋值语句),性能上就有所损失(毕竟多做了一些事情)

另外,假如A没有提供默认构造函数的情况下(这里不考虑C++11新增的{}统一类内初始化的情况)
那么必须在初始化列表进行初始化,这是为什么呢?根据前面我讲述的你自己思考下答案。

0 2017-09-01 16:05:22

只看TA 引用 举报 #5    得分 20

paschen

版主

引用 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

只看TA 引用 举报 #6    得分 0

码无痕

类指针而已,在哪初始化不一样?另外,基类和类成员要在初始化列表去初始化,否则在进入构造函数之前会先调用他们的默认构造函数初始化这些类,而指针不存在这种问题

搬: 含有对象成员指针的类的对象成员指针初始化问题相关推荐

  1. android对象命名的基本规则,类,对象,命名规则

    一. 类: 1. 定义:描述了对象的的特征和对象的行为,类是对象的模板. 2. 类的写法: [修饰符]  class 类名{ 类体语句 } 其中,修饰符可省略. 3. 类中包含的内容: ① 属性 a. ...

  2. 【C++从入门到踹门】第三篇:类和对象(中)类的默认成员函数

    目录 1.类的默认成员函数 2.构造函数 2.1 构造函数引入 2.2 构造函数概念及特点 3. 析构函数 3.1 析构函数引入 3.2 析构函数的概念 3.3 在哪些情况下会程序会执行析构函数? 3 ...

  3. c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性

    本文包含以下内容 1. C++的四类特殊成员函数介绍,重点介绍拷贝构造函数和拷贝复制运算符 2. C++11中的default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https:/ ...

  4. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

  5. python类和对象的定义_python类与对象基本语法

    面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 本人学习笔记基于python2的 ...

  6. Java类和对象基础题_java类和对象基础题2

    创建一个三角形类,成员变量三边,方法求周长,创建类主类A来测试它. import java.util.*;public classSanjiao {private doublea,b,c;privat ...

  7. C++类的成员函数(在类外定义成员函数、inline成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  8. 类与对象(一)----什么是类和对象

    类 类在java语言中是一个数据类型,以class关键词+类名表示.是一个模糊的概念. 类在生活中可以这样理解: 猫是一个类:猫类(class Cat) 猫有品种:田园猫 布偶猫 金渐层 - 猫有年龄 ...

  9. Java类和对象(如何理解类和对象)

    Java类和对象 一.什么是对象? 1.什么是对象的属性? 2.什么是对象的行为 二.什么是类? 三. 类和对象的关系 四.类的定义 1.类的定义格式 2.类的定义示例 五.对象的使用 1.对象的创建 ...

  10. C++类的成员函数(在类外定义成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

最新文章

  1. Tomcat - Tomcat套娃式架构与配置文件的对应关系解读
  2. ios图片放大之后如何不模糊_图片怎样放大后不模糊 图片放大不失真的方法步骤...
  3. oracle pipelined返回值函数 针对数据汇总统计 返回结果集方法
  4. 天下手游卡在获取服务器信息,天下手游召唤兽获取与洗练:新手必须知道的事情...
  5. leetcode—15.链表双指针题目python解答
  6. 几何学五大公理_【欧几里德的平面几何五大公理是什么?】作业帮
  7. SQL注入基础语句大全
  8. matlab 频率分辨率,功率谱、频率分辨率、频谱泄漏与窗函数
  9. Excel学习笔记:P1-Excel入门
  10. 网利友联迈入敏捷开发新时代
  11. 保镖机器人作文_保镖小学生作文
  12. 如何遮挡电影英汉字幕
  13. 新浪云、腾讯云、阿里云、百度云、谷歌云、亚马逊云的区别是什么,哪个更适合国内创业者使用?
  14. 生命是脆弱的-人生最大的挫折
  15. c语言入门题目:输出两行短句
  16. Learn OpenGL 笔记6.9 Deferred Shading(延迟着色)
  17. 802.11无线网络权威——(三、MAC基础)
  18. Linux ls: xxx .: Input/output error 错误问题 及 fsck源码下载
  19. 中软JavaEE软件工程师培训有感
  20. Java、JSP电子政务系统毕业设计

热门文章

  1. CAD 绘图如何有效的控制精度?
  2. pymc3学生成绩分析和预测(补充+翻译)
  3. android apk参数错误,Android adb安装apk时出现报错Invalid APK file如何解决
  4. Matlab查找图像块在原图中的位置
  5. GAN合成语音相关论文
  6. xy坐标转换为极坐标_xy坐标怎么换算(色坐标xy换算uv计算式)
  7. centos7下安装yasm过程
  8. 150个摄影测量与遥感术语,你知多少?
  9. WizTree——一个扫描快似Everything的硬盘空间分析工具
  10. unity3d 双人巡逻兵网络游戏