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(]); } 当我们编译的时候 一般 ...
随机推荐
- Div+CSS常见错误总结
CSS+DIV是网站标准(或称“WEB标准”)中常用的术语之一,通常为了说明与HTML网页设计语言中的表格(table)定位方式的区别,因为XHTML网站设计标准中,不再使用表格定位技术,而是采用cs ...
- 2018-9-30-C#-winforms-输入颜色转换颜色名
title author date CreateTime categories C# winforms 输入颜色转换颜色名 lindexi 2018-09-30 18:27:49 +0800 2018 ...
- Leetcode706.Design HashMap设计哈希映射
不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对.如果键对应的值已经存在,更新这个值. get(key ...
- 如何使我们的薪资15k?
以下我们来探讨一下如何才能使我们具备高薪15K的能力? 要想使自己的薪资成为15K,我首先想到的是我们的能力?编码能力?语言表达能力? 我觉得为之重要的则是我们的综合能力: 方方面面的能力.综合素质: ...
- kubernetes1.4新特性:支持两种新的卷插件
背景介绍 在Kubernetes中卷的作用在于提供给POD持久化存储,这些持久化存储可以挂载到POD中的容器上,进而给容器提供持久化存储. 从图中可以看到结构体PodSpec有个属性是Volumes, ...
- PHPCMS快速建站系列之phpcms v9 模板标签说明整理
[摘要]本文介绍phpcms v9中模板标签使用说明. {template "content","header"} 调用根目录下phpcms\template\ ...
- GIL锁更加深刻理解
参考链接:http://www.cnblogs.com/ajaxa/p/9111884.html
- WinMail邮件服务器(客户端)环境搭建与配置
WinMail邮件服务器(客户端)环境搭建与配置 一.在搭建WinMail邮件服务器(客户端)之前必备 (1).在虚拟机上安装两个干净无毒的操作系统 ...
- 【Django入坑之路】基础操作(过滤,继承,跳转)
1:自定过滤器 1创建templatetags文件夹 2在里面创建自定义py文件:固定格式: from django import template from django.utils.safestr ...
- Gym - 101962K _ Rei do Cangaço
题意:给予n个房间,每个房间可以的到x个金币(x可能为负数),可以进行两种操作: 右移3i个房间,并且打开除最后一个的所有房间,如在1号房间,第一次移动可以移动到4号,并且打开1,2,3三个房间. 只 ...