C++中关于const的思考
在学习C++的过程中,经常被什么时候使用const、为什么使用const以及怎么使用const关键字这样的问题所困扰,以下是我对const的使用总结。
1、值替代
使用#define的确单缺点,第一:没有类型信息,这就会隐藏一些很难发现的错误;
第二:如果只是想取某个class的专属常量地址,#define无法创建一个class的专属常量
第三:#define或许不被视为语言的一部分,这样会导致PI可能不会被编译器看见,以至于在运用此常量时会产生错误信息;
第四:#define不能提供任何封装性
第五:用#define定义一个函数,容易产生一些不可思议的错误
关于const,第一:const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到;
第二:如果用运行期间产生的值初始化一个变量而且知道在变量生命期内是不变的,则用const限定该变量是程序设计中的一个很好的做法
第三:不能在编译期间使用const的值,因为编译器在编译期间不需要知道它存储的内容
第四:C++中的const默认是内部连接,如果想更改为外部连接以便让另外一个文件可以对它引用,需要在前面定义成extern
extern const int x=1;此时强制分配了内存
如果只是声明,extern const int x;则意味着在别处进行了定义。
2、指针
在指针中,const的位置不同,其代表的含义也就不同。
A、关键字const在指针左边,表示被指物是常量。如:
const int* u;
int const* v;
B、关键字const在指针右边,表示指针自身是常量,即这个指针不能指向其它东西,但所指的东西的值可以改变。如:
int d=1;
int* const w=&d;
C、关键字const在指针两边,表示被指物和指针两者都是常量。
int d=1;
const int* const x=&d;
int const* const x2=&d;
3、函数参数和返回值
A、函数参数
如果函数参数是按值传递的,可以用指定参数是const的。在函数参数中使用const限定参数表示参数不能被改变。
B、返回值
对于内建类型,按值返回一个内建类型时,应该去掉const;
对于用户定义的类型,如果一个函数按值返回一个类对象为const时,那么这个函数的返回值不能被赋值,这个有点像只读属性。
4、类
第一:类中const的初始化是在构造函数初始化列表,表里的初始化发生在构造函数的任何代码执行之前。
第二:为了让类有编译期间的常量成员,需要使用static const,必须在static const定义的地方对它进行初始化。关键字static意味着不管类的对象被创建多少次,都只有一个实例。类中的一个常量成员,在该类的所有对象中它都一样。
class A{
static const int size=100;
const string* b[size];
}
第三:两个成员函数如果只是常量性不同,可以被重载。
第四:如果声明一个成员函数为const,则等于告诉编译器该成员函数可以为一个const对象所调用。如果想让成员函数按声明的方式去做,还需要在定义函数时重申const。
第五:前面带const的函数声明,表示该函数的返回值为const。要实现函数的返回值为const,需要在函数的参数表后面放一个const。
第六:在类声明里声明mutable,可以指定一个或多个数据成员在一个const对象里被改变。
class Z{
int i;
mutable int j;
public:
Z();
void f() const;
};
Z::Z():i(),j(){}
void Z::f() const{
i++; //此时会报错,不能修改i
j++; //可以修改j
}
第七:按位const的意思是对象中的每个字节都是固定的,所以对象的每个位映像从不改变
按逻辑const的意思是,虽然整个对象从概念上讲是不变的,但是可以以成员为单位改变。
第八:构造函数和析构函数都不是const成员函数,因为它们在初始化和清除时,总是对对象做些修改。
目前只总结了这么多,如果有漏的或不对的地方,希望大家指出,谢谢。
C++中关于const的思考的更多相关文章
- C++中的const
一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...
- C++中的const关键字
http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...
- C与C++中的const
同样,有下面一段代码: #include <iostream> using namespace std; int main() { ; int *j = (int *) &i; * ...
- C++中加const与不加const的区别
“常量”与“只读变量”的区别. 常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它. “只读变量”则是在内存中 ...
- 关于《Head First Python》一书中print_lol()函数的思考
关于<Head First Python>一书中print_lol()函数的思考 在<Head First Python>第一章中,讲述到Python处理复杂数据(以电影数据列 ...
- C++笔记019:C++中的const修饰的是一个真正的常量
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 程序一: 我们知道数组的下标不能为变量,必须是一个确定的值.在C语言中看程序: #define a 10 int main() { //第 ...
- C++中的const总结
CONST 一.符号常量 声明: const 类型说明符 常量名 = 常量值: const float PI = 3.1415927; //可以交换const与float的位置 符号常量在声明时一定要 ...
- C和C++ 中的const
C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中.所以,以下代码: #include <iost ...
- c++中的const和volatile知识自我总结
学习了下c++中的const关键字,总结如下. 1.const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”. int main() { c ...
随机推荐
- js--小结①
- java 基本知识点学习
1 基本数据类型 整型4种:byte 1个字节:short 2个字节:int 4个字节:long 8个字节. 浮点型:float 4个字节;double 8个字节: 布尔型:boolean tru ...
- C#实现从EXCEL文件读取数据到SqlServer数据库
用第三方组件:NPOI组件实现 先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用.使用 NPOI ...
- 3. NHibernate基础知识 - 你必须知道的一些事情
首先介绍一下框架结构(这个有个概念就可以): 然后我们会介绍一个很重要的概念(一定要好看)!! 这节对 NHibernate 架构做一个介绍,首先要了解一下该框架在应用程序中的位置: 先来一个简单的图 ...
- WPF Radio组的绑定
都是控件编,RadioButtion 简单绑定使用,model.cs下边定义属性 private int _isSuccess; public int IsSuccess { get { return ...
- VS番茄助手安装(vs2015+vs2010):卸载之前的vs助手再安装新版本
1 卸载之前的vs助手 vs2010: vs2015: 2 安装新版本
- 批量缩放PNG图片.
最近需要缩放N多图片, 找遍了互联网也没有找到方便使用的批量缩放工具.. 趁着周末写一个练手.. #include <iostream> #include <vector> # ...
- 可编辑tab选项卡
效果如图所示,基于jq开发的,用原生可能会麻烦点.所以我没写. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...
- winform C#屏幕右下角弹出消息框并自动消失
①弹出信息框后慢慢下降消失 在主窗体中新增按钮重命名为btnShowAndDisappearMessages,在click事件中写如下代码: private void btnShowAndDisapp ...
- 或许有一两点你不知的C语言特性
关键字篇 volatile关键字 鲜为人知的关键字之一volatile,表示变量是'易变的',之所以会有这个关键字,主要是消除编译优化带来的一些问题,看下面的代码 ; int b = a; int c ...