最近发现自己对const这一块其实不甚熟悉,所以复习一下const的相关知识点。

基本用法

const int bufSize = 512;

上面这样就可以将bufSize定义为常量,编译的时候编译器会把用到该变量的地方都替换成对应的值。在代码运行过程中无法为常量另外赋值:

bufSize = 1024;

注意,一定要给定一个值来初始化常量,初始值可以是表达式:

const int j = get_size();

const只限定不能执行会更改到内容的操作,其他的操作例如将const变量的值复制给另一个变量是可以的。

int i;
i = bufSize;

作用范围

定义好的const变量只有在当前文件下才能被访问到,所以在多个文件中定义了同名的const变量的时候其实就等同于在不同文件中分别定义了独立的变量。如果想要在不同文件中共享一个初始值不是常量表达式的常量,那么就要在定义以及其他文件的声明中加上extern:

// file1.cpp
extern const int bufSize = fcn(); // file2.cpp
extern const int bufSize;

左定值,右定向

const int *p = 8;

上面这样写就是让const修饰指针指向的内容,内容必须是常量。

int a = 8;
int* const p = &a;
*p = 9; // 可以更改指向对象的值
int b = 7;
p = &b; // 不能够更改指向方向

上面这样则是指针为常量,但是指针指向的内容可以变。其实const只是限定了权限,只限定自己修饰的那部分不能够被改变值。

还有同时修饰指针和指针指向的内容的情况:

int a = 8;
const int *const p = &a;

修饰成员函数

#include<iostream>

using namespace std;

class Test
{
public:
Test(){}
Test(int _m):_cm(_m){}
int get_cm()const
{
return _cm;
} private:
int _cm;
}; void Cmf(const Test& _tt)
{
cout<<_tt.get_cm();
} int main(void)
{
Test t(8);
Cmf(t);
system("pause");
return 0;
}

这样写get_cm就不允许修改成员变量。

参考

《C++ Primer 第5版》:看就是了,别废话

C++ const 关键字小结

C++随笔(0)——关于const的更多相关文章

  1. vc6.0运用mysql数据库中的编码所导致的乱码问题(接收和输出的编码必须要一致)

    [编译中遇见的问题]       ①在用vc 6.0去调用MySQL中的数据时,出现中文乱码       ②不明白mysql中的码制 [开始解决问题]      ①打开mysql控制台         ...

  2. C++ const用法 尽可能使用const [转载]

    C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...

  3. Effective C++ 之 Item 3:尽可能使用 const

    Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...

  4. 指针与const

    指向常量的指针,不能用于改变其所指对象的值. 指针的类型必须与所指对象的类型一致,但是有两个例外,第一种是允许令一个指向常量的指针指向一个非常量对象: double dra1 = 3.14; cons ...

  5. 关于const和define的内存分配问题的总结

    关于const和define的内存分配问题 const与#define宏定义的区别----C语言深度剖析 1,  const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静 ...

  6. iOS—— static和const联合使用;使用static const 与 #define

    static和const联合使用:   static将一个全局变量变成局部变量   const将一个局部变量变成局部常量 // 定义了一个局部常量      static const CGFloat ...

  7. POJ 1573 Robot Motion 模拟 难度:0

    #define ONLINE_JUDGE #include<cstdio> #include <cstring> #include <algorithm> usin ...

  8. POJ 2632 Crashing Robots 模拟 难度:0

    http://poj.org/problem?id=2632 #include<cstdio> #include <cstring> #include <algorith ...

  9. Hdu 1506 Largest Rectangle in a Histogram 分类: Brush Mode 2014-10-28 19:16 93人阅读 评论(0) 收藏

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  10. AFNetWorking3.0使用 自签名证书的https请求

    前几日,项目组出于安全角度的考虑,要求项目中的请求使用https请求,因为是企业内部使用的app,因此使用了自签名的证书,而自签名的证书是不受信任的,所以我们就需要自己来做证书的验证,包括服务器验证客 ...

随机推荐

  1. JS转为number的四种方法

    // 1.Number() var num1 = Number(true); console.log(num1); var num2 = Number(" ") console.l ...

  2. Mongodb中的js语法

    定义一个变量 > var len = 10; For循环 这里的db和data都可以作为对象 save是方法 接收一个临时定义的对象 > for(var i = 0; i < len ...

  3. springboot+elasticsearch 报错

    错误1: .d.e.r.s.AbstractElasticsearchRepository : failed to load elasticsearch nodes : org.elasticsear ...

  4. python 单元测试_unittest(七)

    一.unittest中各阶段的核心概念:TestCase, TestSuite, 断言函数, TextTestRunner,TestFixture TestCase:所用用例的基类,软件测试中基本的测 ...

  5. css 点击打开遮罩

    <div> <nav class="bar bar-tab"> <a class="tab-item external" href ...

  6. requests结合xpath爬取豆瓣最新上映电影

    # -*- coding: utf-8 -*- """ 豆瓣最新上映电影爬取 # ul = etree.tostring(ul, encoding="utf-8 ...

  7. eclipse从SVN中检出web项目

    提交到svn的时候,选择忽略.project,.settings,.classpath等文件,检出项目的时候就不能选择 [做为工作作为工作空间的项目检出].而应该选择做为新项目检出. 然后选择工程的类 ...

  8. Python:n个点的费马问题

    问题描述 在平面内有n(n>=3)个点N1(x1,y1),N2(x2,y2),...,Nn(xn,yn),现求一点P(x,y),使得P到各点直线距离之和最小. 算法分析 当n=3时,这是著名的三 ...

  9. element-ui 弹出添加拖拽功能

    1.新建dialog.js文件2.在main.js 中引入dialog.js  import ‘./utils/dialog.js’3. 使用:<el-dialog v-dialogDrag&g ...

  10. 【WC2016】论战捆竹竿

    已经快三周了啊--终于把挖的坑填了-- 首先显然是把除了自身的所有border拿出来,即做 \(\left\{ n - b_1, n - b_2, \dots, n - b_k, n \right\} ...