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 ...
随机推荐
- 使用Preference保存设置
http://blog.csdn.net/barryhappy/article/details/7381544 Android中有四种持久化数据的方法:SQLite数据库.文件存储.Preferenc ...
- 转: angularjs 指令中动态编译的方法(适用于有异步请求的情况) 内嵌指令无效
angular的坑很多 例子: 在directive的link中有一个$http请求,当请求完成后根据返回的值动态做element.append('......');这个操作, 能显示没问题,可问题是 ...
- Lucene5.x 中文 同义词
查询好好多资料,英文同义词好好的,中文就不行,多谢网友支持,拼接了好多代码,然后修改了一些,不足之处,多谢指正. 直接上代码吧,在代码中了解怎么分词的最好 1,创建分词引擎 public interf ...
- 从1到n整数中1出现的次数
题目如题 如 5 中1出现的次数 为1 12中1出现的次数为5 public class NumberOf1Between1AndN { /* *输入一个整数n,求从1到n这N个十进制表示中1出现的次 ...
- map函数(转)
STL中map用法详解 说明:如果你具备一定的C++ template知识,即使你没有接触过STL,这个文章你也应该可能较轻易的看懂.本人水平有限,不当之处,望大家辅正. 一.Map概述 Map是ST ...
- [Introduction to programming in Java 笔记] 1.3.9 Factoring integers 素因子分解
素数 A prime is an integer greater than one whose only positive divisors are one and itself.整数的素因子分解是乘 ...
- 从外国html5网站上扒来一个鼠标经过的css3 效果,感觉很不错
鼠标经过的时候,感觉有点像一张纸卷上去的感觉. 下面是代码 <div class="main-container types"> <div class=" ...
- createjs 下雪 实例
demo: http://output.jsbin.com/davixatona <!DOCTYPE html> <html> <head> <meta c ...
- PHP的类自动加载机制
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来. 这个在小规模开发的时候,没什么大问题.但在大型的开发项目中, ...
- Mac系统安装Lua(转)
下载最新版的lua请点击,然后解压 运行“终端”进入到该文件夹下 ,主要是cd [文件夹名] 在“终端”输入 make macosx (回车) 在“终端”输入 make test (回车) 然后再输入 ...