1.const常量和宏常量
const int max=100;
#define max 100;
const常量相对宏常量有两个有点:
1)有类型安全检查
2)占用内存空间少

2.const变量在内存中的位置
我们在C程序的内存布局中,已经通过示例进行了说明

#include <stdio.h>
const int a = ; ////全部常量a
int main()
{
const int b = ; //局部常量b
int* pa = (int*)&a;//报错,因为全部常量放在只读数据段
int* pb = (int*)&b;//修改成功,因为局部常量放在栈上
*pa = ;
*pb = ;
return ;
}

3.const常成员变量的初始化
在某个对象生存期内是常量。

class Test
{
public:
const int a;
Test(int i):a(i){}
}

const常量只能通过初始化列表的方式进行初始化。

4.const修饰对象
该对象不能修改。只能访问成员变量,不能修改。只能调用常成员函数。
关于常成员函数,我们在后面介绍。
如下例所示:

#include<iostream>
class Test
{
public:
int a;
void fun0(){}
void fun1() const{}
};
int main()
{
Test test;
const Test& a_test = test;
std::cout<<a_test.a<<std::endl;//正常,访问公共成员a
a_test.fun0();//报错,对象包含与成员函数不兼容的类型限定符
a_test.fun1();//正常
return ;
}

5.const修饰指针
我们看一下下面四种写法:

) const int* a = ;
) int const *a = ;
) int* const a = ;
) const int* const a = ;

我们需要知道的是,
const在*左,表示指针指向的内容为常量,这也是我们平时说的常量指针
const在*右,表示指针本身为常量,这也是我们平时说的指针常量
因此,1),2)表示指针a指向的内容不能修改
3)表示指针a本身不能修改
4)表示指针a和a指向的内容都不能修改

6.const修饰成员函数,函数参数,返回值
1)修饰成员函数

void fun1() const;

成员函数名后加上const,即表明该函数为常成员函数。
常成员函数的const隐式修饰this指针,即对象不可修改,
所以,常成员函数只能访问成员变量,而不能修改。只能调用其他常成员函数。
如下例所示:

int g_a;
void g_fun(){}
class Test
{
public:
void fun0(){}
void fun1() const{}
void fun2() const
{
a = ;//报错,“必须是可修改的左值”
fun0();//报错,对象包含与成员函数不兼容的类型限定符
fun1();//正常,可调用其他常成员函数 g_a = ;//正常
g_fun();//正常
}
private:
int a;
}

2)修饰函数参数

void fun0(const Test* p_test);
void fun1(const Test& test);

在传入的参数前,加上const,表明传入的参数不可修改。

3)修饰函数返回值

const Test fun0();
const Test* fun1();

当使用const Test* fun1();返回指针时,该返回值只能赋给const修饰的同类型指针。
如下例所示:

class Test
{
public:
void fun0(){}
const Test fun1(){
return *this;
}
const Test* fun2(){
return this;
}
};
int main()
{
Test test;
Test r = test.fun1();
const Test* rp = test.fun2();
}

C++ const使用详解的更多相关文章

  1. C++初学者 const使用详解

     关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文. 1. const常量 如: cons ...

  2. const用法详解(转)

    http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...

  3. C++中const用法详解

    本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...

  4. es6学习笔记(1) let和const命令详解

    let和const命令: Es6新增了let命令,声明变量,但与var不一样的,只在let命令所在的代码块内有效(如for循环之外let声明的变量就不再有效).并且let不像var那样会发生" ...

  5. C++ Const引用详解

    (1)       在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...

  6. (转) C/C++中const关键字详解

    文章转自  http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维 ...

  7. C++中const关键字详解

    1.什么是const? const意味着是常量类型,被const修饰的变量或对象是不能被修改和更新的,当然在某些情况下,我们可以偷梁换柱的改变它. 2.为什么要引入const? 最初的目的是为了取代预 ...

  8. const关键字详解

    const在函数前与函数后的区别 一   const基础         如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:         int   b   =   500; ...

  9. ECMAScript6-let与const命令详解

    前言 <ECMAScript入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript6新引入的语法特性. let和const命令,是第一章开始介绍,也是比较基础的知识. ...

随机推荐

  1. 未来WEB程序员

    作为一名程序员,如果你想在这个领域内继续向前进步或者在当前的经济形势下保持不被炒鱿鱼,那么你就决不应当自满自足,你需要继续学习.近日,著名IT评论员Justin James在他的博客中列出了未来五年程 ...

  2. Python 类的一些BIF

    issubclass issubclass(cls, class_or_tuple, /) Return whether 'cls' is a derived from another class o ...

  3. Linux命令(1)-创建文件

    版本:centos7 1.可以使用cat创建一个新的文件 命令:cat>>filename 使用cat创建文件时,以系统默认的文件属性作为新文件的属性,并接受键盘输入作为文件的内容.输入结 ...

  4. Shell’s Sort

    Solution 1 : (数据结构与算法分析 C++描述 第三版) template<class T> void shellSort(vector<T> &v) { ...

  5. 【Zhejiang University PATest】02-3. 求前缀表达式的值

    算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算 ...

  6. UVA11624(bfs)

    题意:给一张图,有火源,有障碍物,剩下的是道路,火源在下一分钟能够让上下左右四个方向的道路也着火,告诉人的位置,问最短时间能逃出去的时间是多少: 思路:一个bfs用来求出所有的火源能蔓延到的地方,另一 ...

  7. 【LeetCode OJ】Interleaving String

    Problem Link: http://oj.leetcode.com/problems/interleaving-string/ Given s1, s2, s3, find whether s3 ...

  8. 【转】 golang slice array

    1. array   同一类型数据的集合     var arr [n]type    //声明type类型一维数组     var arr [m][n]type //声明type类型二维数组     ...

  9. magento搬家步骤和可能遇到的问题

    将原来网站文件中的var文件中的cache和session文件删除,将media中的缓存文件删除.然后将所有文件制作成一个压缩包,以减少文件体积,方便转移. 将压缩包转移到新的服务器域名指向的文件夹, ...

  10. 解决织梦标签artlist不能调用副栏目的问题?

    本文转自:http://www.xinshou5.com/a/127.html 织梦列表页中不支持artlist这个标签,这样怎么调用副栏目? 想要在列表页调用副栏目,但是列表页不支持artlist这 ...