zoukankan      html  css  js  c++  java
  • 第20课 初始化列表的使用

    类中是否可以定义const成员?

    小实验:

    类中的const成员实验:

     1 #include <stdio.h>
     2 
     3 class Test
     4 {
     5 private:
     6     const int ci;
     7 public:
     8     Test()
     9     {
    10         ci = 10;
    11     }
    12     int getCI() 
    13     { 
    14         return ci; 
    15     }
    16 };
    17 
    18 
    19 int main()
    20 {
    21     Test t;
    22     
    23     printf("t.ci = %d
    ", t.getCI());
    24     
    25     return 0;
    26 }

    编译结果如下:

    可以看到用这个类定义一个对象时,const成员必须要初始化。但是这个初始化不能在构造函数中去做。

     因为ci是只读变量,只读变量是不能出现在赋值符号的左边的,所以第10行会报错。编译器提示我们要在第八行进行初始化,第八行怎么进行呢?

    初始化列表:

    类成员的初始化:

     合法的初始化如下:

    运行结果如下:

    ci的值在初始化过后仍然可以改变,因为它只是一个只读变量,不能出现在赋值符号的左边,但是我们可以通过一个指针来改变。

    初始化列表的注意事项:

    初始化列表的初始化是在类对象的创建过程中进行的,而不是类对象创建好了之后才进行。

    初始化列表的使用示例:

     1 #include <stdio.h>
     2 
     3 class Value
     4 {
     5 private:
     6     int mi;
     7 public:
     8     Value(int i)
     9     {
    10         printf("i = %d
    ", i);
    11         mi = i;
    12     }
    13     int getI()
    14     {
    15         return mi;
    16     }
    17 };
    18 
    19 class Test
    20 {
    21 private:
    22     Value m2;
    23     Value m3;
    24     Value m1;
    25 public:
    26     Test() : m1(1), m2(2), m3(3)
    27     {
    28         printf("Test::Test()
    ");
    29     }
    30 };
    31 
    32 
    33 int main()
    34 {
    35     Test t;
    36     
    37     return 0;
    38 }

     类对象成员变量的初始化也必须通过初始化列表来完成。

    运行结果如下:

    可以看到初始化顺序是m2、m3、m1,和他们的定义顺序是一样的。而Test的构造函数是在初始化列表之后进行的。

    类中的const成员:

    类中const成员的所在的空间和它所在的对象所在的空间是一致的,对象在栈上,const成员就在栈上,对象在堆上,const成员就在堆上。

    示例程序:

     1 #include <stdio.h>
     2 
     3 class Value
     4 {
     5 private:
     6     int mi;
     7 public:
     8     Value(int i)
     9     {
    10         printf("i = %d
    ", i);
    11         mi = i;
    12     }
    13     int getI()
    14     {
    15         return mi;
    16     }
    17 };
    18 
    19 class Test
    20 {
    21 private:
    22     const int ci;
    23     Value m2;
    24     Value m3;
    25     Value m1;
    26 public:
    27     Test() : m1(1), m2(2), m3(3), ci(100)
    28     {
    29         printf("Test::Test()
    ");
    30     }
    31     int getCI()
    32     {
    33         return ci;
    34     }
    35     int setCI(int v)
    36     {
    37         int* p = const_cast<int*>(&ci);
    38         
    39         *p = v;
    40     }
    41 };
    42 
    43 
    44 int main()
    45 {
    46     Test t;
    47     
    48     printf("t.ci = %d
    ", t.getCI());
    49     
    50     t.setCI(10);
    51     
    52     printf("t.ci = %d
    ", t.getCI());
    53     
    54     return 0;
    55 }

    运行结果如下:

    可以看到const成员就是只读变量,编译器不会去符号表中取它的值,我们可以通过指针更改const成员的值。

    小插曲:

     在C语言中,int i=0是初始化,  int i;  i = 0这是赋值。它们是不一样的。

    小结:

  • 相关阅读:
    美达飞凡16X DVD起死回生记
    vs2k5 中asp.net "Web Site Administration Tool "使用中遇到的问题
    有关sqlserver的锁
    基于dotnet2.0的联通sgip1.2协议二级网关源码
    .net winform下TreeNode在没有子结点时也显示+号的解决办法
    小胜凭智, 大胜靠德
    寄语八十年代的新一代
    PHP+APACHE+MYSQL+WINDOWS 环境配置秘笈,一定行!!!!
    JS获取当前屏幕分辨率
    godaddy免费空间安装wordpress教程之500错误的解决办法/读写权限修改
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9569363.html
Copyright © 2011-2022 走看看