,,,,,,,,我们之前在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初始化列表的使用十(五)