参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结

1.用于定义常量变量,这样这个变量在后面就不可以再被修改

const int val = 90;

val = 100;   错误

2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,

则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护

 void fun1(const int &val)
  {
      //val = 10; //错误
  }
 
  void fun2(int &val)
  {
      val = 100; //正确
  }

注意:对于引用修饰函数的参数,定义如下,如果是内部结构数据类型,我们一般不用 & 引用,而对于非结构类型,我们一般用引用。

3. 节约内存空间

#define PI 3.14
 
const double pi = 3.14; 
 
 double  a = pi;  //这时候才为Pi分配内存,不过后面再有这样的定义也不会再分配内存
 
 double  b = PI;  //编译时分配内存
 
 double  c = pi;  //不会再分配内存,
 
 double  d = PI;  //编译时再分配内存
 
//const定义的变量,系统只为它分配一次内存,而使用#define定义的常量宏,能分配好多次,这样const就很节约空间

4.类中使用const修饰函数防止修改非static类成员变量

  class a
  {
  public:
      void fun() const
      {
          //a = 10; 错误,不可修改非static变量
          b = 10;   //正确,可以修改static变量
      }
  protected:
  private:
      int a;
      static int b;
  };

这一点主要是用来确定,哪个函数可以用来改动对象内容,而哪些函数不可以用来改变对象内容。

5、修饰指针

const int *a; int const *a; 效果一样,主要是*号与const的位置,在*左边,表示修饰物,在右边表示修饰指针。

    int m = 10, j = 100;
    const int *p1 = &m;//const在*左边,表示修饰物,*p不可变。p可变。
    printf("%p,%d\n",p1,*p1);
    //*p1 = 100;//错误,*p1不可变,但没规定p1不可变,p1可以指向其他的变量。
    p1 = &j;
    printf("%p,%d\n",p1,*p1);

在上面的程序中,我们也可以改变m的值,这是可以的。

6.修饰函数返回值,防止返回值被改变

const int fun();

7.修饰类的成员变量

这一点的话,初始化是个需要注意的地方。

如果是const 修饰的变量,可以不可以在类里面直接初始化,而是必须在构造函数初始化列表中初始化。而static修饰的变量,必须在类外初始化。当是const与static修饰的变量,必须在类外初始化。


  class a
  {
  public:
 
     // const int val = 100; 错误
      const int val;
      static int val1;
      const static int val2 ; 
 
      //const static int val2 = 100; //这个不会 报错,对于常量可以在类内部初始化,也可以在类外部初始化。
      a():val(100) //const变量必须在构造函数初始化列表中进行初始化
      {
 
      }
 
      void fun() const
      {
          //a = 10; 错误,不可修改非static变量

b = 10; //正确,可以修改static变量

//val = 100; val是const类型,不可以被修改

      }
  protected:
  private:
      int a1;
      static int b;
  };
 
  int a::b = 100;
  int a::val1 = 100;//static变量必须在类外初始化
  const int a::val2 = 100;//const static保留了static的特性,可以在类外初始化,也可以在类内部初始化

eg2:

class A
{
public:
const static int b = 10;
//const int c = 11; //error
//static int d = 12;//error
const int c;
static int d;
A():c(11)
{
// d = 12; error
}
protected:
private:
};

int A::d = 12;

调用:

A* aa = new A();
cout << aa ->b <<" "<< aa->c <<" "<<aa->d << endl;

8.const定义的对象变量只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用

要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为

extern const int val;

Effective C++ 条款三 尽可能使用const的更多相关文章

  1. Effective C++ -----条款03:尽可能使用const

    如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " he ...

  2. 《Effective C++》读书笔记 条款03 尽可能使用const 使代码更加健壮

    如果你对const足够了解,只需记住以下结论即可: 将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施 ...

  3. Effective C++_笔记_条款03_尽可能使用const

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 关键字const多才多艺,语法变化多端.关于const的基本用法 ...

  4. 条款21: 尽可能使用const

    对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const,还有,两者都不指定为const: char *p = "hello"; ...

  5. 条款03 尽可能使用const

    一.概述 使用const约束对象:可以获得编译器的帮助(指出相关出错的地方) const与成员函数:const重载.转型.避免代码重复 二.细节 1. 为什么有些函数要返回const对象(看上去没必要 ...

  6. 《Effective C++(第三版)》-笔记

    1. 让自己习惯C++ 条款01: 视C++为一个语言联邦 1.1 C++ 是一个多重泛型编程语言(multiparadigm programming),支持:过程形式(procedural),面向对 ...

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

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

  8. C++学习书籍推荐《Effective C++ 第三版》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)>前两个版本抓住了全世界无数程序员的目光.原因十分明显:S ...

  9. More Effective C++ 条款0,1

    More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...

随机推荐

  1. Verilog学习笔记基本语法篇(三)·········赋值语句(待补充)

    在Verilog HDL语言中,信号有两种赋值方式. A)非阻塞赋值(Non-Blocking)方式(如:b<=a;) (1)在语句块中,上面语句所赋值的变量不能立即为下面的语句所用: (2)块 ...

  2. JQuery中xxx is not a function或者can not find $

    在项目中,遇到以上两个错误,反复折腾了好久,js代码写得没有问题,jquery的文件也引入了,就是反复的报告错误,xxx is not a function.如图: 就是这样的错误,shake is ...

  3. Linux下配置MySQL主从复制

    一.环境准备 本次准备两台Linux主机,操作系统都为CentOS6.8, 都安装了相同版本的MySQL.(MySQL5.7). 主从服务器的防火墙都开启了3306端口. 相关信息如下: [主服务器] ...

  4. HP DL380 G5 安装操作系统流程

    1.准备服务器引导盘,设置光盘启动.注意:会将服务器所有数据清除 2.依据引导盘选择需要的安装系统 3.插入系统安装光盘.ps:若kvm等远程工具无法插入光盘,需要插入物理介质的安装光盘

  5. ython——杂货铺

    三目运算: >>> 1 if 5>3 else 0 1 >>> 1 if 5<3 else 0 0 深浅拷贝: 一.数字和字符串 对于 数字 和 字符串 ...

  6. 大数据学习——azkaban工作流调度系统

    azkaban的安装部署 在/root/apps 1目录下新建azkaban文件夹 上传安装包到azkaban 2解压 .tar.gz 3删掉安装包 [root@mini1 azkaban]# .ta ...

  7. .NET重构(六):删除用户和结账的理解

    导读:这是第二回机房了,第一回不明不白,不清不楚的就过去了(相对),这一回,有了新的发现.就是在用户删除的时候,涉及到的一些逻辑问题,以及结账时的数据来源问题. 一.用户删除 问题:第一次机房,包括重 ...

  8. BZOJ-1303 中位数图

    先找到B的位置x,然后依次统计A[i..x-1](0<i<x)中小于B的个数,和A[x+1..i](x<i<n)中大于B的个数 最后Answer等于(左边有i个小于B的情况总数 ...

  9. BZOJ 1113 Wall ——计算几何

    凸包第一题. 自己认为自己写的是Andrew 其实就是xjb写出来居然过掉了测试. 刚开始把pi定义成了int,调了半天 #include <map> #include <cmath ...

  10. bzoj2324 [ZJOI2011]营救皮卡丘 费用流

    [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2653  Solved: 1101[Submit][Status][D ...