const(每个对象中的常量), static const(类的编译时常量)
1 每个对象中的常量 --- const数据成员
const限定,意味着“在该对象生命周期内,它是一个常量”。 关键字const 使被限定的量为常量
在该类的每个对象中,编译器都为其const数据成员分配存储空间。在该类的每个对象中,const数据成员可以取不同的值(可以初始化成不同的值),但是const数据成员的值一旦初始化以后就不能改变。
该初始化工作必须在构造函数里进行
2 类的编译时常量 --- 类的静态常量数据成员
static const
类的一个常量成员,该类的所有对象都只有一个实例,并且在其生命周期中不会改变
3 类的静态数据成员
static限定,意味着“不管类的对象被创建多少次,都只有一个实例”
类的静态数据成员,拥有一块单一的存储空间,而不管创建了多少个该类的对象。所以这些对象的静态数据成员共享一块静态存储空间。
类的静态数据(属于类,不依附于某个对象的存在而存在),所以其不适合在构造函数中初始化。一个静态数据成员其声明在类中,但其定义出现在类型外部,而且只能出现一次,通常放在类的实现文件中
在类A中声明了静态数据成员i;在定义文件中,为静态数据成员定义存储区,并初始化为1
#include <iostream> class A
{
static int i; public:
void func(); }; int A::i = ;
void A::func()
{
using namespace std;
cout<<"i = "<<i<<endl;
} int main()
{
A a;
a.func(); // i = 1 return ;
}
如果在定义文件中,没有给静态数据成员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)
例子:
#include <iostream>
using namespace std; class Values
{
private: //普通常量成员(非static的常量成员)
const int cSize; //常量成员的初始化,必须在构造函数中进行,每个对象都有,只是成员常量数据在初始化就不能改变 //禁止在类内对"非const的静态成员"进行初始化
//static int sFloat = 100; //Values.cpp:8:24: error: ISO C++ forbids in-class initialization of non-const static member ‘Values::sFloat’
static float sFloat; //类的静态成员,所以对象共享同一块内存单元
static int sInts[]; static const float scFloat; //类的静态常量成员在类中初始化
static const int scInts[]; int size; public:
Values(const int cSize, int sz) : cSize(cSize), size(sz) {} void print() const; static void printStatic();
}; //类的普通private成员
//int Values::size = 100; //error C2350: 'Values::size' is not a static member //类的静态数据成员定义
float Values::sFloat = 1.1;
int Values::sInts[] = {, , }; //类静态常量数据成员定义
const float Values::scFloat = 100.01;
const int Values::scInts[] = {, , }; //定义一个全局变量size
int size = ; void Values::print() const
{
cout<<"::size = "<<size<<endl;
cout<<"Values::cSize = "<<cSize<<endl;
cout<<"Values::size = "<<size<<endl;
cout<<"Values::sFloat = "<<sFloat<<endl;
cout<<"Values::scFloat = "<<scFloat<<endl;
} void Values::printStatic()
{
cout<<"printStatic(), Values::scFloat = "<<scFloat<<endl;
cout<<"printStatic(), Values::scInts[] = {"<< scInts[] <<", " <<scInts[] << ", " << scInts[] <<"}"<<endl; cout<<"printStatic(), Values::sFloat = "<<sFloat<<endl;
cout<<"printStatic(), Values::sInts[] = {"<< sInts[] <<", " <<sInts[] << ", " << sInts[] <<"}"<<endl;
} int main()
{
Values v(, ); v.print(); Values::printStatic(); return ;
}
const(每个对象中的常量), static const(类的编译时常量)的更多相关文章
- Java编译时常量和运行时常量
Java编译时常量和运行时常量 编译期常量指的就是程序在编译时就能确定这个常量的具体值. 非编译期常量就是程序在运行时才能确定常量的值,因此也称为运行时常量. 在Java中,编译期常量指的是用fina ...
- 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)
概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...
- 在JAVA中利用public static final的组合方式对常量进行标识
在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...
- java中的编译时常量与运行时常量
常量是程序运行期间恒定不变的量,许多程序设计语言都有某种方式,向编译器告知一块数据是恒定不变的,例如C++中的const和Java中的final. 根据编译器的不同行为,常量又分为编译时常量和运行时常 ...
- java 运行时常量、编译时常量、静态块执行顺序
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt223 常量是程序运行时恒定不变的量,许多程序设计语言都有某种方法,向编译器告 ...
- OC中的extern,static,const
const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 被const修饰的变量是只读的. static的作用: 修饰局部变量: 1.延长局部变量的生命周期,程序结束才会 ...
- mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- [技术干货-算子使用] Mindspore 控制流中存在原地更新操作类副作用算子时循环值不更新问题记录
关于mindspore 原地更新类算子的一点思考记录如下: 现象记录: 原始测试代码 错误结果复现: 分析: 如果在场景中加入42行的copy()操作此时cpu的结果就会正确,但是gpu的结果则不受c ...
- 程序中引入库文件的头文件 编译时并不需要显示的用gcc去链接他的库文件 why?
拿一个苹果系统下的c文件为例: testArr.c #include <stdio.h> int main() { , , , , }; printf(]); } 当我们编译的时候 一般 ...
随机推荐
- 如何在CentOS 7 / Fedora 31/30/29上安装ELK Stack
原文地址:https://computingforgeeks.com/how-to-install-elk-stack-on-centos-fedora/ 原作者: Josphat Mutai 译者: ...
- PYTHON网络爬虫与信息提取[正则表达式的使用](单元七)
正则表达式由字符和操作符构成 . 表示任何单个字符 []字符集,对单个字符给出取值范围 [abc]或者关系 [a-z]表示 [^abc]表示非这里面的东西 非字符集 * 表示星号之前的字符出现0次或 ...
- JS DOM节点的增删改查
合并拆分 行内样式 script写在html里面
- 廖雪峰Python总结3
1.模块简介 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件中,这样每个文件包含的代码相对来说就比较少.一个.py文件就称之为一个模块(Module). 使用模块的好处: 提高了代码的可 ...
- spss命令数据整理中compute与record命令的区别
spss命令数据整理中compute与record命令的区别 record修改存在的变量,或者生成新的变量 spss变量定义说明 1.Name:变量名,定义规则与其它软件中的雷同,如第一个字符必须为字 ...
- c# 日期函数
DateTime dt = DateTime.Now;Label1.Text = dt.ToString();//2005-11-5 13:21:25Label2.Text = dt.ToFileTi ...
- 【JZOJ4890】【NOIP2016提高A组集训第14场11.12】随机游走
题目描述 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己 ...
- java8 各种时间转换方法
java8 各种时间转换方法 本来按照常理日期时间是一个很简单的东西,只需要根据一个时间戳就可以算出当前的时间了.但这其实只是初级的想法,是因为你的项目还没有到跨时区部署的程度,一旦你的项目要部署到其 ...
- ef core 随记
EntityTypeConfiguration internal class OrderEntityTypeConfiguration : IEntityTypeConfiguration<Or ...
- 折腾spring boot 应用
开发环境 安装配置java环境 配置maven环境,修改镜像地址 <mirror> <id>aliyunmaven</id> <mirrorOf>*&l ...