• const(每个对象中的常量), static const(类的编译时常量)


    1 每个对象中的常量 --- const数据成员

    const限定,意味着“在该对象生命周期内,它是一个常量”。 关键字const 使被限定的量为常量

    在该类的每个对象中,编译器都为其const数据成员分配存储空间。在该类的每个对象中,const数据成员可以取不同的值(可以初始化成不同的值),但是const数据成员的值一旦初始化以后就不能改变。

    该初始化工作必须在构造函数里进行

    2 类的编译时常量 --- 类的静态常量数据成员

    static const

    类的一个常量成员,该类的所有对象都只有一个实例,并且在其生命周期中不会改变

    3 类的静态数据成员

    static限定,意味着“不管类的对象被创建多少次,都只有一个实例”  

    类的静态数据成员,拥有一块单一的存储空间,而不管创建了多少个该类的对象。所以这些对象的静态数据成员共享一块静态存储空间。

     类的静态数据(属于类,不依附于某个对象的存在而存在),所以其不适合在构造函数中初始化。一个静态数据成员其声明在类中,但其定义出现在类型外部,而且只能出现一次,通常放在类的实现文件中

    在类A中声明了静态数据成员i;在定义文件中,为静态数据成员定义存储区,并初始化为1

     1 #include <iostream>
     2 
     3 class A 
     4 {
     5     static int i;
     6     
     7 public:
     8     void func();
     9     
    10 };
    11 
    12 int A::i = 1;
    13 
    14 void A::func()
    15 {
    16     using namespace std;
    17     cout<<"i = "<<i<<endl;
    18 }
    19 
    20 int main()
    21 {
    22     A a;
    23     a.func(); // i = 1
    24     
    25     return 0;
    26 }

    如果在定义文件中,没有给静态数据成员i提供定义,那么连接时将产生错误:

    Linking...
    Values.obj : error LNK2001: unresolved external symbol "private: static float Values::sFloat" (?sFloat@Values@@0MA)
    A.obj : error LNK2001: unresolved external symbol "private: static int A::i" (?i@A@@0HA)
    Debug/vc_test.exe : fatal error LNK1120: 2 unresolved externals
    Error executing link.exe.
    Creating browse info file...
    
    vc_test.exe - 3 error(s), 0 warning(s)
    

    例子:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class Values
     5 {
     6 private:
     7     
     8     //普通常量成员(非static的常量成员)
     9     const int cSize; //常量成员的初始化,必须在构造函数中进行,每个对象都有,只是成员常量数据在初始化就不能改变
    10     
    11     
    12     //禁止在类内对"非const的静态成员"进行初始化
    13     //static int sFloat = 100; //Values.cpp:8:24: error: ISO C++ forbids in-class initialization of non-const static member ‘Values::sFloat’
    14     static float sFloat; //类的静态成员,所以对象共享同一块内存单元
    15     static int sInts[];
    16     
    17     
    18     
    19     static const float scFloat; //类的静态常量成员在类中初始化
    20     static const int scInts[];
    21     
    22     int size;
    23     
    24 public:
    25     Values(const int cSize, int sz) : cSize(cSize), size(sz) {}
    26     
    27     void print() const;
    28     
    29     static void printStatic();
    30 };
    31 
    32 
    33 //类的普通private成员
    34 //int Values::size = 100; //error C2350: 'Values::size' is not a static member
    35 
    36 //类的静态数据成员定义
    37 float Values::sFloat = 1.1; 
    38 int Values::sInts[] = {1, 2, 3};
    39 
    40 //类静态常量数据成员定义
    41 const float Values::scFloat = 100.01;
    42 const int Values::scInts[] = {11, 22, 33};
    43 
    44 //定义一个全局变量size
    45 int size = 7;
    46 
    47 
    48 void Values::print() const
    49 {
    50     cout<<"::size = "<<size<<endl;
    51     cout<<"Values::cSize = "<<cSize<<endl;
    52     cout<<"Values::size = "<<size<<endl;
    53     cout<<"Values::sFloat = "<<sFloat<<endl;
    54     cout<<"Values::scFloat = "<<scFloat<<endl;
    55 }
    56 
    57 
    58 void Values::printStatic()
    59 {
    60     cout<<"printStatic(), Values::scFloat = "<<scFloat<<endl;
    61     cout<<"printStatic(), Values::scInts[] = {"<< scInts[0] <<", " <<scInts[1] << ", " << scInts[2] <<"}"<<endl;
    62     
    63     cout<<"printStatic(), Values::sFloat = "<<sFloat<<endl;
    64     cout<<"printStatic(), Values::sInts[] = {"<< sInts[0] <<", " <<sInts[1] << ", " << sInts[2] <<"}"<<endl;
    65 }
    66 
    67 
    68 int main()
    69 {
    70     Values v(1, 3);
    71     
    72     v.print();
    73     
    74     Values::printStatic();
    75     
    76     return 0;
    77 }
  • 相关阅读:
    CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第七节
    CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第六节
    数组逆序=全局内存版 VS 共享内存版
    CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第五节
    CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第四节
    【转载】Caffe + Ubuntu 14.04 + CUDA 6.5 新手安装配置指南
    Andrew NG 自动化所演讲(20140707):DeepLearning Overview and Trends
    机器学习资源
    CUDA实现数组倒序
    CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第三节
  • 原文地址:https://www.cnblogs.com/asnjudy/p/4543649.html
Copyright © 2020-2023  润新知