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(]); } 当我们编译的时候 一般 ...
随机推荐
- ES6 中变量的解构赋值
1. 数组的解构赋值 解构: ES6 中允许按照一定的模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构(Destructuring). 1. 基本用法 本质上,这种写法属于"模式匹 ...
- Postgresql 正则表达式【转】
原文:http://blog.csdn.net/wugewuge/article/details/7704996 postgresql支持POSIX 风格的正则表达式,在postgresql中使用正则 ...
- python深、浅拷贝
1.首先对于数字和字符串而言,深浅拷贝无实际意义,两者同时指向同一个内存地址. a = 123 print(id(a)) b = a print(id(b)) 495849744 495849744 ...
- 【JZOJ4815】【NOIP2016提高A组五校联考4】ksum
题目描述 输入 输出 样例输入 3 4 1 3 4 样例输出 8 7 4 4 数据范围 样例解释 解法 二分做法 考虑到可以二分第k大的值mid,如果比mid大的区间和数小于或等于mid,那么mid就 ...
- ansible Ansible Galaxy ansible-playbook 安装 使用 命令 笔记 生成密钥 管控机 被管控机 wget epel源
笔记 ansible 安装 与salt对比 相同 都是为了同时在多台机器上执行相同的命令 都是python开发 不同 agent(saltstack需要安装.ansible不需要) 配置(salt配置 ...
- PyCharm2019 永久激活
<!-- 2019激活码 2019-06-21新更新 --> D00F1BDTGF-eyJsaWNlbnNlSWQiOiJEMDBGMUJEVEdGIiwibGljZW5zZWVOYW1l ...
- API管理的五大规则
http://www.csdn.net/article/2012-12-18/2812929-5-Rules-For-API-Management 1. 设计 开发人员使用API访问各种不同的类,并且 ...
- Mac下搭建python开发环境
目录 1. 安装brew 2. 安装 mysql 3. 安装 pycharm 4. 安装python3.6 5. 安装virtualenvwrapper 6. 虚拟环境下安装mysqlclient 1 ...
- Linux终端常用命令(一)
基本操作 展示全部的环境变量 export 搜索可执行文件.源文件 whereis ls 在环境变量中搜索可执行文件,并打印完整路径 which ls 展示用户命令,系统调用.库函数等 whatis ...
- MaxCompute客户端(odpscmd)在windows命令行下查询中文乱码问题处理实践
MaxCompute客户端工具是阿里云大数据计算服务MaxCompue产品官方客户端工具,通过客户端工具可以连接MaxCompute项目,完成包括数据管理.数据上下传.作业执行.用户及授权管理等各项操 ...