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(]); } 当我们编译的时候 一般 ...
随机推荐
- LintCode刷题笔记-- BackpackIV
标签: 动态规划 描述: Given an integer array nums with all positive numbers and no duplicates, find the numbe ...
- Web学习之跨域问题及解决方案
在做前端开发时,我们时常使用ajax与服务器通信获取资源,享受ajax便利的同时,也知道它有限制:跨域安全限制,即同源策略. 同源策略(SOP),核心是确保不同源提供的文件之间是相互独立的 默认情况下 ...
- 详细介绍Java中的堆、栈和常量池
下面主要介绍JAVA中的堆.栈和常量池: 1.寄存器 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈 存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在 ...
- UWP获取任意网页加载完成后的HTML
主要思想:通过后台WebView载入指定网页,再提取出WebView中的内容 关键代码: var html = await webView.InvokeScriptAsync("eval&q ...
- PHPCMS快速建站系列之getcache()的用法
/** * 读取缓存,默认为文件缓存,不加载缓存配置. * @param string $name 缓存名称 * @param $filepath 数据路径(模块名称) caches/cache_$f ...
- Centos7搭建Django出现的问题(Centos7+Django1.11.1+Nginx+uwsgi)
出现的问题: 1.pip未安装:http://www.cnblogs.com/fnng/p/3737964.html 2.安装uwsgi失败,因为未安装python-devel yum search ...
- PAT天梯赛L1-002 打印漏斗
题目链接:点击打开链接 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形 ...
- java memory allocation(转)
Java的运行时数据存储机制 Java程序在运行时需要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存储?这些数据结构有什么特点?本文试图说明此命题的皮毛之皮毛. 概念 对 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION) 学习目标 ...
- 洛谷1758 BZOJ1566 管道取珠题解
题目链接 一道人类智慧的dp题 首先我们可以将∑ai^2转化为求取两次,两次一样的方案数 然后用f[i][j][k][l]表示第一个人在第一个串中取到i第二个串中取到j 第二个人在一个串中取到k第二个 ...