初始化列表的使用十(五)

  

,,,,,,,,我们之前在C语言中可以定义const成员,那么我们是否可以在类中定义const成员呢?我们来看看下面代码中的类定义是否合法呢?如果合法,ci的值是什么,存储在哪里呢?

# include  & lt; stdio.h>      class 测试   {   私人:   ,,,const  int  ci;   公众:   ,,,int  getCI ()   ,,,{   ,,,,,,,return  ci;   ,,,}   };      int  main ()   {   ,,,Test  t;   ,,,,   ,,,printf (“t.ci =, % d \ n",, t.getCI ());   ,,,,   ,,,return  0;   }

,,,,,,,,照我们之前学习的知识可以猜测对象t是创建于栈上,那么它中ci的便会是随机值了。我们看看编译结果

初始化列表的使用(十五)

,,,,,,,,编译报错,它说我们没有初始化ci、下面我们在它定义的时候并初始化为10。也就是将第6行改为const int ci=10,我们再次看看它是否编译通过初始化列表的使用(十五)

,,,,,,,,我们看到编译产生警告了,虽然它的运行结果是正确的。我们之前说过,一个优秀的程序员会将任何一个警告都看作是错误的,因为它的结果将是不确定的。这样写是由问题的,洽好g++编译器支持这样写,我们不能写出依赖于某种编译器特性的代码,所以这时便会用的到,它的语法规则如下

初始化列表的使用(十五)

,,,,,,,,那么我们在程序中加上构造函数并用初始化列表进行初始化,如下

测试(),:,ci (5)   {,,,   }

,,,,,,,,我们再次编译,如下

初始化列表的使用(十五)

,,,,,,,,我们看到编译器没有报任何警告,这便证明了在c++中提供了初始化列表对成员变量进行初始化。那么我们在这块有几个注意事项:。为例更加形象的说明,我们再次以代码为例进行说明

# include  & lt; stdio.h>      class 价值   {   私人:   ,,,int 心肌梗死;   公众:   ,,,的值(int 我)   ,,,{   ,,,,,,,printf(“小姐:=,% d \ n",, i);   ,,,,,,,   ,,,,,,,mi =,我;   ,,,}   ,,,int  getMI ()   ,,,{   ,,,,,,,return 心肌梗死;   ,,,}   };      class 测试   {   私人:   ,,,Value 平方米;   ,,,Value  m3;   ,,,Value  m1;   公众:   ,,,测试(),:,m1 (1), (2) m2, m3 (3)   ,,,{   ,,,,,,,printf(“测试:测试()\ n");   ,,,}   };      int  main ()   {   ,,,Test  t;   ,,,,   ,,,return  0;   }

,,,,,,,,我们在测试类中定义了3个值对象,然后在构造函数中使用了初始化列表对他们进行初始化。在构造函数中我们加入了一条打印语句,按照我们之前讲的,应该在初始化完了之后再打印那条语句。我们编译看看结果

初始化列表的使用(十五)

,,,,,,,,我们看到打印的是如我们分析的那样,但是前面初始化的顺序好像不太一样,我们是按照m1, m2, m3这样的顺序进行初始化的。想想我们之前说的:初始化的顺序和它声明的顺序相同,和它的位置并无关,所以看看我们声明顺序就知道打印的是正确的了。

,,,,,,,,我们以代码为例进行说明

# include  & lt; stdio.h>      class 测试   {   私人:   ,,,const  int  ci;   公众:   ,,,测试(),:,ci (10)   ,,,{   ,,,,,,,printf(“测试:测试()\ n");   ,,,}   ,,,,   ,,,int  getCI ()   ,,,{   ,,,,,,,return  ci;   ,,,}   ,,,,   ,,,int  setCI (int  v)   ,,,{   ,,,,,,,int *, p =, const_cast初始化列表的使用十(五)