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(类的编译时常量)的更多相关文章

  1. Java编译时常量和运行时常量

    Java编译时常量和运行时常量 编译期常量指的就是程序在编译时就能确定这个常量的具体值. 非编译期常量就是程序在运行时才能确定常量的值,因此也称为运行时常量. 在Java中,编译期常量指的是用fina ...

  2. 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)

    概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...

  3. 在JAVA中利用public static final的组合方式对常量进行标识

    在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...

  4. java中的编译时常量与运行时常量

    常量是程序运行期间恒定不变的量,许多程序设计语言都有某种方式,向编译器告知一块数据是恒定不变的,例如C++中的const和Java中的final. 根据编译器的不同行为,常量又分为编译时常量和运行时常 ...

  5. java 运行时常量、编译时常量、静态块执行顺序

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt223 常量是程序运行时恒定不变的量,许多程序设计语言都有某种方法,向编译器告 ...

  6. OC中的extern,static,const

    const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 被const修饰的变量是只读的. static的作用: 修饰局部变量: 1.延长局部变量的生命周期,程序结束才会 ...

  7. mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  8. [技术干货-算子使用] Mindspore 控制流中存在原地更新操作类副作用算子时循环值不更新问题记录

    关于mindspore 原地更新类算子的一点思考记录如下: 现象记录: 原始测试代码 错误结果复现: 分析: 如果在场景中加入42行的copy()操作此时cpu的结果就会正确,但是gpu的结果则不受c ...

  9. 程序中引入库文件的头文件 编译时并不需要显示的用gcc去链接他的库文件 why?

    拿一个苹果系统下的c文件为例: testArr.c #include <stdio.h> int main() { , , , , }; printf(]); } 当我们编译的时候  一般 ...

随机推荐

  1. listView中的button控件获取索引

    1.在listitem中初始化button的时候,给该button添加一个setTag方法,将此时的索引值传进去,然后在button的onclick事件中调用view的getTag方法,即可将list ...

  2. 集合-Collection接口

    集合 和 数组 的比较: 数组 - 本质上就是在内存空间中申请的一段连续内存空间,存放多个相同类型的数据 - 数组一旦定义完毕,则在内存空间中的长度固定. - 插入/删除元素时可能导致大量元素的移动, ...

  3. 将CMD命令提示符的起始位置进行更改 / CMD起始位置发生改变后如何修改回来

    具体步骤如下: 1.首先我们需要先找到命令提示符所在的文件目录.可以在开始运行程序中输入CMD,一般回自动搜索匹配. 2.右键点击命令提示符,在弹出菜单中,选择“打开文件位置”: 3.然后我们就可以进 ...

  4. DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER

    原文:DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u01033 ...

  5. Ubuntu卸载通过apt-get命令安装的软件

    卸载一个已安装的软件包(删除配置文件): apt-get --purge remove packagename

  6. js Date格式化时间兼容写法

    var time = "2018-03-12 11:11:11".split(/[- : \/]/); date = new Date(time[0], time[1]-1, ti ...

  7. input的表单验证(不断更新中~~)

    1 手机号验证 <input type="tel" id="phone" name="phone" placeholder=" ...

  8. Linux的一些简单命令操作总结

    防火墙 查看防火墙状态 systemctl status iptables (或service iptables status) 关闭防火墙 systemctl stop iptables(或serv ...

  9. 第三十二讲:UML类图(下)

    一个类能够看到另外一个类的属性和方法,那么这两个类是关联的.

  10. 解决/home磁盘空间不足问题

    最近在Linux下做仿真实验,但是渐渐的发现,/home原来分配的空间不足.通过先建硬盘分区,然后挂载到/home文件的方法,在网上查了好多资料 建立分区并挂载分区http://www.se126.c ...