CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

用初始化列表初始化变量的小问题

楼主jxliang()2005-03-17 21:49:42 在 C/C++ / C++ 语言 提问

#include   <iostream>  
  using   namespace   std;  
   
  int   s=0;  
   
  class   sample  
  {  
          static   int   n;  
   
          public:  
  sample(int   i){n=i;}  
   
  static   void   add(){s+=n;}  
   
  };  
   
  int   sample::n=0;  
   
  void   main()  
  {  
          sample   a(2),b(5);  
   
  sample::add();  
   
  cout<<"s="<<s<<endl;  
   
  }  
   
  为什么我把程序中的sample(int   i){n=i;}改为用初始化列表sample(int   i):n(i){}来初始化n时,编绎器报错说:cannot   initialize   static   class   data   via   constructor呢?  
  问题点数:20、回复次数:9Top

1 楼kylix2003(Jelly)回复于 2005-03-17 21:54:10 得分 4

static   int   n;  
   
  类的静态成员变量是需要放在类外部初始化的。  
  Top

2 楼CMyMfc(星际人生:=E.F=FlyForEver)回复于 2005-03-17 21:55:54 得分 2

int   sample::n;  
   
  既然你想每个类构造的时候给它赋值,   为何要设成static呢Top

3 楼yliang(风之悄语)回复于 2005-03-17 21:58:18 得分 1

我这儿没问题,vc++7.1(vs.net2003)通过,s=5Top

4 楼kobefly(科比--网络学习中)回复于 2005-03-17 22:00:04 得分 3

静态类成员变量的初始化比较特殊  
   
  是必须在类外初始化的  
   
  因为静态成员不属于某个对象  
   
  而是属于整个类的  
  对立于类而存在的Top

5 楼yc0188(守护瓶(萍))回复于 2005-03-17 22:11:54 得分 2

int   sample::n;  
  这样就可以了!Top

6 楼jxliang()回复于 2005-03-17 22:13:29 得分 0

可能有个别的人误会我的意思了.我在上面给出的程序是可以运行的,但把程序中的sample(int   i){n=i;}改为sample(int   i):n(i){}后,编绎器就不能通过了,是不是有点奇怪呢?Top

7 楼yliang(风之悄语)回复于 2005-03-17 23:44:27 得分 4

设有:  
  class   A  
  {  
  };  
   
  class   B1  
  {  
  public:  
            B1(const   A   &_a):a(_a)//直接初始化  
            {  
            }  
            A   a;  
  };  
   
  class   B2  
  {  
  public:  
            B2(const   A   &_a)  
            {  
                  a=_a;//这里的a是在B2的B2(const   A   &_a)执行之前调用A的构造函数初始化,然后在B2(const   A   &_a)里面将_a赋给a的  
            }  
            A   a;  
  };  
   
  BJ的原话:  
        The   members'   constructor   are   called   before   the   body   of   containing   class'   own   constructor   is   executed.  
  Top

8 楼GeminiXXXCC(吕布)回复于 2005-03-17 23:55:19 得分 0

static   int   n;  
   
  类的静态成员变量是需要放在类定义的外部进行定初始化的。  
  ^_^Top

9 楼yliang(风之悄语)回复于 2005-03-18 00:42:34 得分 4

又,《Effective   C++》提到:  
  Static   data   members   act   like   global   and   namespace   objects,   so   they   are   initialized   only   once。  
  所以编译器为了避免多次initialize(初始化)静态成员,在类的初始化列表中不允许出现静态成员的初始化,但在后面的大括号里面却是可以的。Top

相关问题

  • 初始化列表!!
  • 类中静态变量如何初始化如何使用
  • 类中申明的引用变量如何初始化?
  • VARIANT变量的初始化?!
  • 如何用javascript初始化下拉列表?
  • Dialog,怎样使用构造函数初始化列表?
  • 请问要用什么函数来初始化列表框呢?
  • 有关用户界面线程创建窗口变量初始化的问题
  • 用什么方法可以判断一个整型变量是否初始化
  • 静态成员变量如果不能用operator =时该如何初始化

关键词

  • 初始化
  • sample
  • static
  • add

得分解答快速导航

  • 帖主:jxliang
  • kylix2003
  • CMyMfc
  • yliang
  • kobefly
  • yc0188
  • yliang
  • yliang

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo