
若一个变量声明为static,则该变量就会储存在程序的静态区域;那么在程序开始运行的时候,该变量就会一直存在,而不是随着所在函数运行终止而终止。(储存在栈中,该为类所有)
另外:static声明的变量必须在类外初始化;
若一个变量声明为const,则意味着该变量为不可变。所在类实例对象时,才会创建该变量(存在在堆中,该变量为对象所有)。
另外:const声明变量需要在初始化列表中初始化。(还未对其他初始化方式测试,待学习)
若一个变量声明为static const,表示变量存储在静态区,且该变量不可改变。
另外:static const声明的变量必须在初始化时赋值。
下面是测试的代码,供参考
#include
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(2022.06.04)
关于const,参考C++Primmer 2.4.1节 敲了一遍,
先说自己的观点
代码如下
#include
using 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地址相同,就是同一个东西。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)