免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2438 | 回复: 4

[C++] 初始化列表不算是赋值语句吗? 很奇怪的一个问题。 [复制链接]

论坛徽章:
0
发表于 2009-08-18 23:11 |显示全部楼层
10可用积分
下面这段代码可以运行
#include<stdio.h>
int k=2;
class c{
public:
  int i;
  const int j;
  c():j(++k){}
};
int main(void){
  printf("sizeof c is %d\n",sizeof(c));
  c c1;
  c c2;
  printf("c1.j=%d,c2.j=%d\n",c1.j,c2.j);
};
结果是
sizeof c is 8
c1.j=3,c2.j=4

但是我把构造函数的c():j(++k){}改为c(){j=++k;}就不行,
h.cxx:7: 错误:assignment of read-only data-member ‘c::j’

我的问题是: 初始化列表不算赋值语句吗?

谢谢!!!!!!!!!!!!!!!!!!!!!!!

最佳答案

查看完整内容

当然不算咯。 初始化和赋值是两个不同的概念。对buildin类型, 初始化和赋值并没有太大区别, 可以在初始化时, 给它一个值, 或者在使用前, 给它赋值。但是, 如果加了const限定, 情况就不同了。 const对象只能初始化, 一旦初始化完毕, (通常)不能再被改变(包括赋值)。因为j是一个const对象, 所以只能初始化, 而不能赋值。C++构造函数中, 成员初始化列表, 就是执行初始化的部分; 构造函数体执行时,该对象已经构造 ...

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2009-08-18 23:11 |显示全部楼层

回复 #1 jeanlove 的帖子

当然不算咯。  初始化和赋值是两个不同的概念。
对buildin类型, 初始化和赋值并没有太大区别, 可以在初始化时, 给它一个值, 或者在使用前, 给它赋值。

但是, 如果加了const限定, 情况就不同了。 const对象只能初始化, 一旦初始化完毕, (通常)不能再被改变(包括赋值)。
因为j是一个const对象, 所以只能初始化, 而不能赋值。

C++构造函数中, 成员初始化列表, 就是执行初始化的部分; 构造函数体执行时,该对象已经构造完毕。
所以, j应该放在成员初始化列表中, 在那里进行初始化工作; 构造函数体部分, c的所有成员已经构造完毕, j是它的一个const成员,不能再被赋值。

[ 本帖最后由 OwnWaterloo 于 2009-8-18 23:23 编辑 ]

论坛徽章:
0
发表于 2009-08-18 23:17 |显示全部楼层
原帖由 jeanlove 于 2009-8-18 23:11 发表
下面这段代码可以运行
#include
int k=2;
class c{
public:
  int i;
  const int j;
  c():j(++k){}
};
int main(void){
  printf("sizeof c is %d\n",sizeof(c));
  c c1;
  c c2;
  printf("c1 ...


见lz对j的声明: const int j;
那么这里的j是常量,就如提示的一样,只能引用,而不能赋值.

assignment of read-only data-member ‘c::j’         意思是c::j是只读成员.

[ 本帖最后由 system888net 于 2009-8-18 23:20 编辑 ]

论坛徽章:
0
发表于 2009-08-19 10:35 |显示全部楼层
原帖由 jeanlove 于 2009-8-18 23:11 发表
下面这段代码可以运行
#include
int k=2;
class c{
public:
  int i;
  const int j;
  c():j(++k){}
};
int main(void){
  printf("sizeof c is %d\n",sizeof(c));
  c c1;
  c c2;
  printf("c1 ...

不算,常量成员只能在初始化列表中赋值。

论坛徽章:
0
发表于 2009-08-19 10:44 |显示全部楼层
是一个作用域的问题,初始化列表还是对象初始化的作用域,而初始化函数已经是对象初始化完成的作用域了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP