若一个变量声明为static,则该变量就会储存在程序的静态区域;那么在程序开始运行的时候,该变量就会一直存在,而不是随着所在函数运行终止而终止。(储存在栈中,该为类所有)
另外:static声明的变量必须在类外初始化;
若一个变量声明为const,则意味着该变量为不可变。所在类实例对象时,才会创建该变量(存在在堆中,该变量为对象所有)。
另外:const声明变量需要在初始化列表中初始化。(还未对其他初始化方式测试,待学习)
若一个变量声明为static const,表示变量存储在静态区,且该变量不可改变。
另外:static const声明的变量必须在初始化时赋值。
下面是测试的代码,供参考
#includeconst(2022.06.04)class Const_demo { public: Const_demo(); const int c1; int c2; }; Const_demo::Const_demo():c1(1) { c2 = 2; } class Static_demo { public: Static_demo() { } static int s1; static const int s2 = 15; }; int Static_demo::s1 = 10; int main() { //测试1:static声明的变量在程序开始的位置存在 std::cout << "Static_demo.s1: " << &Static_demo::s1 << std::endl; // static 变量 std::cout << "Static_demo.s2: " << &Static_demo::s2 << std::endl; // static 变量 //std::cout << "Const_demo.a: " << Const_demo::a << std::endl; // 错误提示:非静态变量必须和特定对象使用 Const_demo C1 = Const_demo(); Const_demo C2 = Const_demo(); Static_demo S1 = Static_demo(); Static_demo S2 = Static_demo(); //测试2:static声明的变量时,是属于类所有(只有一个地址,为所有对象共有);而const声明的变量为类所对应的对象所有(不同的地址,每个对象中都包含自己的变量) std::cout << "C1.a: " << C1.c1 << std::endl; std::cout << "C2.a: " << C2.c1 << std::endl; std::cout << "C1.a的地址为: " << &C1.c1 << std::endl; std::cout << "C2.a的地址为: " << &C2.c1 << std::endl; std::cout << "S1.s1: " << S1.s1 << std::endl; std::cout << "S2.s1: " << S2.s1 << std::endl; std::cout << "S1.s1的地址为: " << &S1.s1 << std::endl; std::cout << "S2.s1的地址为: " << &S2.s1 << std::endl; //测试3:static声明的变量在程序运行期间可以改变;而Static const声明的变量不可修改 Static_demo::s1 = 15; std::cout << "S1.s1: " << S1.s1 << std::endl; std::cout << "S2.s1: " << S2.s1 << std::endl; std::cout << "S1.s1的地址为: " << &S1.s1 << std::endl; std::cout << "S2.s1的地址为: " << &S2.s1 << std::endl; //Static_demo::s2 = 15; //错误提示,表达式的左值必须是可修改的 std::getchar(); }
关于const,参考C++Primmer 2.4.1节 敲了一遍,
先说自己的观点
代码如下
#includeusing namespace std; int main() { double dval = 3.14; const int rd = dval; dval = 6.14; cout << "rd " << rd << " dval " << dval << endl; int ival = 3; const int ri = ival; ival = 6; cout << "ri " << ri << " dval " << ival << endl; int i1 = 5; int& r1 = i1; i1 = 10; cout << "i1 " << i1 << " r1 " << r1 << endl; r1 = 20; cout << "i1 " << i1 << " r1 " << r1 << endl; const int i2 = 50; const int& r2 = i2; cout << "i2 " << i2 << " r2 " << r2 << endl; cin.get(); return 0; }
这几个变量的地址如下
由上面图案可以看出dval和rd、ival和ri是两个地址,所以是两个变量,赋值后两者不存在什么关系;而i1和r1、i2和r2地址相同,就是同一个东西。



