BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #93510同步于 2016/9/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教一个Effective C++中的问题

wuwuqifang
2016/9/21镜像同步9 回复
书中条款2有下面这段代码 class GamePlayer{ private: static const int NumTurns = 5;//语句1 int scores[NumTurns]; ... }; 不太懂为啥语句1算作常量声明式,这一句话不是把定义和声明都包括了么? 还是说在类内定义的常量并没有实例化,没分配内存,所以不算声明? 渣渣求大神解答。。。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
zx723机器人#1 · 2016/9/23
去了解一下c++对象模型?或者自己写个例子反汇编一哈,汇编之下,了无秘密 通过『我邮2.0』发布
bythw机器人#2 · 2016/9/23
不是很理解你问的这个问题,第一句用了static和const,类中的静态变量的意思是不管你实例化多少个GamePlayer,它们都是共享同一个静态变量,并且在定义的时候就给这个静态变量分配好了空间,而const则表示NumTurns不能改变,所以语句1就相当于常量声明式
wuwuqifang机器人#3 · 2016/9/23
就是在类外,const int a=10;这条语句不是把a的定义和声明同时完成了么? 为啥语句1就只是一个声明(declaration),而不是声明和定义式(definition)呢? 【 在 bythw (云314) 的大作中提到: 】 : 不是很理解你问的这个问题,第一句用了static和const,类中的静态变量的意思是不管你实例化多少个GamePlayer,它们都是共享同一个静态变量,并且在定义的时候就给这个静态变量分配好了空间,而const则表示NumTurns不能改变,所以语句1就相当于常量声明式 通过『我邮2.0』发布
wuwuqifang机器人#4 · 2016/9/23
汇编...臣妾做不到啊... 【 在 zx723 (好方) 的大作中提到: 】 : 去了解一下c++对象模型?或者自己写个例子反汇编一哈,汇编之下,了无秘密 : 通过『我邮2.0』发布 通过『我邮2.0』发布
solosseason机器人#5 · 2016/9/23
【 在 wuwuqifang 的大作中提到: 】 : 就是在类外,const int a=10;这条语句不是把a的定义和声明同时完成了么? : 为啥语句1就只是一个声明(declaration),而不是声明和定义式(definition)呢? : : ................... 我的理解是,如果在类外,const int a=10,则这个a是全局常量,谁都可以调用。在类里面定义的话,这个a只能是类的实例才能共用的常量。语句①应该就是声明和定义吧,只不过人家没这么说明,不知这么理解对不对...
wuwuqifang机器人#6 · 2016/9/23
可是书上的意思是语句1只是一个声明,而非定义,如果编译器强制要求定义式,需要加上 const int classname::a; 【 在 solosseason (solosseason) 的大作中提到: 】 : 我的理解是,如果在类外,const int a=10,则这个a是全局常量,谁都可以调用。在类里面定义的话,这个a只能是类的实例才能共用的常量。语句①应该就是声明和定义吧,只不过人家没这么说明,不知这么理解对不对... 通过『我邮2.0』发布
solosseason机器人#7 · 2016/9/23
【 在 wuwuqifang 的大作中提到: 】 : 可是书上的意思是语句1只是一个声明,而非定义,如果编译器强制要求定义式,需要加上 : const int classname::a; : : ................... 可能是说类的静态成员只能有一个副本,因此初始化必须在类体外进行,类里面只能声明??等大神来解答...
DAZONGSHI机器人#8 · 2016/9/23
其实大部分语言中声明和定义几乎混为一谈,但是在C++中就分比较开,你可以理解为声明表明从这一刻开始这个量是可见的(跟作用域有关系),而定义则决定了内存装的东西,定义一般就包括了声明,而一般说声明的地方则只是为了使接下来使用这个数据变得合理。比如 int a = 0;这是一个声明并定义;而int a; a = 0;这是一个声明然后定义,当然有些默认有初值的地方在int a的时候就已经是定义了,比如全局的情况下;其实看C++ effective这类书,最重要的是理解作者这么用是比其他方法好,不一定是其他方法就会出错;并且是找到自己的精华子集,而不是说将其当做教条;我本人的一条原则是大部分变量我都会在定义时初始化,而不管其会不会默认初始化(符合根本安全性)。而且这里作者是要指明类中的静态成员所占用的内存是要在编译时就确定的,而其中数组的长度又是由另外一个成员决定的,数组的大小要在编译时确定,所以必须给其一个初值,在高版本的C++中这段代码应该可以通过编译,但是11版以前会出错,这就需要将 = 5这一行为在外边进行,也即在类中声明,在类外定义。其实语言的有些行为是由其内存以及基础逻辑所决定的,这是一定要遵守的,有些则是表层的规定,无强制理由,但是要遵循。 【 在 wuwuqifang 的大作中提到: 】 : 书中条款2有下面这段代码 : class GamePlayer{ : private: : ...................
wuwuqifang机器人#9 · 2016/9/23
醍醐灌顶,多谢大牛! 【 在 DAZONGSHI (DAZONGSHI) 的大作中提到: 】 : 其实大部分语言中声明和定义几乎混为一谈,但是在C++中就分比较开,你可以理解为声明表明从这一刻开始这个量是可见的(跟作用域有关系),而定义则决定了内存装的东西,定义一般就包括了声明,而一般说声明的地方则只是为了使接下来使用这个数据变得合理。比如 int a = 0;这是一个声明并定义;而int a; a = 0;这是一个声明然后定义,当然有些默认有初值的地方在int a的时候就已经是定义了,比如全局的情况下;其实看C++ effective这类书,最重要的是理解作者这么用是比其他方法好,不一定是其他方法就会出错;并且是找到自己的精华子集,而不是说将其当做教条;我本人的一条原则是大部分变量我都会在定义时初始化,而不管其会不会默认初始化(符合根本安全性)。而且这里作者是要指明类中的静态成员所占用的内存是要在编译时就确定的,而其中数组的长度又是由另外一个成员决定的,数组的大小要在编译时确定,所以必须给其一个初值,在高版本的C++中这段代码应该可以通过编译,但是11版以前会出错,这就需要将 = 5这一行为在外边进行,也即在类中声明,在类外定义。其实语言的有些行为是由其内存以及基础逻辑所决定的,这是一定要遵守的,有些则是表层的规定,无强制理由,但是要遵循。 通过『我邮2.0』发布