const关键字的基本功能和用法:

1.const的用法:

(1)定义常量

(2)修饰函数的参数

(3)修饰函数的返回值

(4)修饰函数的定义体

  1.将限定符声明为只读,修饰普通类型的变量。

       在类型前/后加上关键字const,该变量必须被初始化,否则编译错误;该变量不能被重新赋值,否则也编译错误。举例:

const int i=100;  //ok
const int i;   //error
int k=0;
i=k;    //error i被定义为一个常量  不可以再对i进行赋值 其值不允许修改
k=i;      //ok   可以将i赋值给b,

接着看下面代码:

int main()
{const  int a = 7;int *p = (int*)&a;*p=8;cout<<a;system("pause");return 0;
}

对于const变量a,我们取变量的地址并转换赋值给 指向int的指针,然后利用 *P=8;重新对变量a地址内的值进行赋值,然后查看a的值。从下面的窗口可得,a的值被修改为8,但是输出的结果仍然是7。

编译器一开始认为a的值为一开始定义的7,所以对const a 的操作进行出现如此情况。千万不要轻易对 const变量进行赋值 ,

如果不想让编译器察觉到对const的操作 可以加 volatile关键字   volatile关键字与const对应相反,是易变的,容易改变,所以不会被编译器优化,编译器也就不会改变对a变量的操作。

2.用于修饰函数的参数,保护参数使其不被修改

    (1)  const只能修饰输入参数

如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针所指向的对象的值。

例如:void  StringCopy(char * strDestination,const char * strSource);

       若形参为 const A*a,则不能改变函数所传递的内容,这样对指针所指向的内容起到保护作用,这里需要注意的是,该修饰不能修饰指针所指向地址所存储的内容,但是指针a 所指向的地址可以被改变,

若形参为 const A &a,则不能改变函数传递进来的引用对象,从而保护了原对象的属性。

对于自定义的数据类型,用引用传递速度较快,如果不想改变原值,就可以用const来保护参数,如以下例子;

void Test(const int &a)  //保护 a  不会被改变
{a=2; //错误 a不能给常量赋值
}

(2)值传递的const修饰传递,一般情况不需要const修饰,因为函数会自动产生临时变量赋值实参值。

#include<iostream>
using namespace std;void Cpf(const int a)
{cout<<a;//++a;     error  变量a 不能被改变
}int main(void)
{Cpf(8);system("pause");return 0;
}

(3)而对于自定义数据类型(非内部数据类型)的输入参数,为了提高速度和效率,应使用“const + 引用传递” 代替值传递。

例如:将void Test(A a)改为 void Test(const A &a)

因为函数体内将产生A类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将耗费时间;“引用传递”只是借用一下参数的别名而已,不需要产生临时对象。

(4)事实上对于内置型数据类型的输入参数(如以上例子中的int类型),不要将“值传递”的方式改为“引用传递”,因为用引用传递不会使速度更快。即达不到提高效率的目的,又降低了函数的可理解性。

例如: void Fun(int x) 改为  void Fun(const int &x)

因为内部数据类型的参数不存在构造,析构的过程,而复制也比较快,“值传递”和“引用传递”的效率几乎相当。

3.用const修饰函数的返回值

(1)如果给以 “指针传递” 的方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。

例如:函数const char *GetString(void);

正确的是 :const char *str=GetString();     //写成 char *str=GetString(); 将出现编译错误

(2)如果函数返回值采用“值传递”方式,由于函数会把返回值复制到临时的外部的存储单元上,所以加const没有任何价值。

例如: 不要把函数 int  Getlnt(void) 写成 const int Getlnt(void).

(3) 函数返回值采用“引用传递”的场合并不多,这种方式一般都只出现在类的赋值函数

4.const修饰指针变量

const修饰指针变量有三种情况:

A: const修饰指针指向的内容,则内容为不可变量

const int *p =8;
//指针指向的内容8 不可改变,简称左定值,因为const位于 *号的左边

B:    const修饰的是指针,则指针为不可变量

int a =8;
int * const p=&a;
*p=9;         // ok   对于const指针p 其指向的内存地址不能够被改变,但是其内容可以改变,简称 右定向,因为const 位于*号的右边
int b=7;
p=&b;        //no

C: const修饰的是指针和指针指向的内容,则指针和指针指向的内容都是不可变量。

int a=8;
const int * const p=&a;
//const 不仅修饰指针p  还修饰p指向的内容,都已经固定,不可改变

对于A,B,C三种情况,根据const位于 *号位置不同,总结为:“左定值、右定向、const修饰不变量”

详解const 用法相关推荐

  1. OpenCV Mat类详解和用法

    OpenCV Mat类详解和用法 我们有多种方法可以获得从现实世界的数字图像:数码相机.扫描仪.计算机体层摄影或磁共振成像就是其中的几种.在每种情况下我们(人类)看到了什么是图像.但是,转换图像到我们 ...

  2. 最全ES6详解及用法

    最全ES6详解及用法 前言 babel babel使用方法 变量的定义 let.const this 和作用域 do 顶层对象 global对象 import class JS中的原型 原型语言 pr ...

  3. OpenCV Mat类详解和用法(官网原文)

    参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...

  4. C++(17)--详解const

    详解const <老九学堂C++课程><C++ primer>学习笔记.<老九学堂C++课程>详情请到B站搜索<老九零基础学编程C++入门> ----- ...

  5. windows下创建进程,CreateProcess()详解及用法

    windows下想要创建一个子进程不如linux的fork函数来得方便,通过CreateProcess函数创建一个新的进程,函数的定义如下 [cpp]  view plain copy BOOL Cr ...

  6. 【ADB 操作命令详解及用法大全(非常全)】

    ADB操作命令详解及用法大全 一.ADB是什么?   ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供 ...

  7. spring注解详解与用法(总览)

    这篇文章收集了我写的所有的spring注解的详细说明与用法,点击可以跳转到对应文章,此文章会不断更新 spring注解详解与用法(1)最基础也是最常见的如下所示,详情点击这里 @Controller/ ...

  8. Symbol 详解与用法

    目录 前言: 一.什么是 Symbol? 二.Symbol 的特点 三.Symbol 的使用 总结: 前言: ES5中对象的属性名都是字符串,容易造成重名,污染环境 一.什么是 Symbol? Sym ...

  9. chatgpt赋能python:Python取ln函数详解:用法及常见问题解答

    Python取ln函数详解:用法及常见问题解答 Python取ln函数是一种非常常用的数学函数,它可以帮助开发者在计算中处理数据的自然指数对数.本篇文章将会介绍Python中取ln函数的基础知识,让您 ...

最新文章

  1. oracle调用存储过程
  2. boost::with_lock_guard相关的测试程序
  3. access2003的使用
  4. 【转】OWIN是什么?
  5. 从MapX到MapXtreme2004[4]-标注AutoLabel
  6. Docker 安装基本操作
  7. 【前端】相信你会用到的一篇笔记---HTML篇
  8. linux的c文件报错for,安装Ubuntu时报错 Failed to load ldlinux.c32
  9. html文件做屏保win10,win10怎么自己添加动态屏保
  10. 【发布】Arknights(明日方舟)拆包+桌面精灵
  11. 金蝶K3WISE盘点机PDA扫码入库仓库条码管理,外购入库单
  12. 云计算技术实际上就是计算机网络的,浅析计算机网络的云计算技术.doc
  13. 记录使用git时出现Permission denied 问题的解决
  14. 前端JS获取ModelMap的值 2020-09-03
  15. Winform平台的HTML编辑控件——Zeta HTML
  16. 苹果资讯|iOS 14.2 Beta为Control Center添加了新的Shazam音乐识别功能
  17. 对一阶电路的瞬态分析
  18. 加推个人名片为何受到资本和市场的青睐?
  19. 2021年发外链还有用吗?
  20. Chrome 浏览器 设置黑色主题

热门文章

  1. docsify搭建个人博客
  2. 服务器共享硬盘存储,服务器挂载nfs共享存储盘
  3. 流浪星球 planet
  4. 机器学习笔记 - 范数
  5. qq2007与win2003server sp2不兼容,死机的解决
  6. 我的创作纪念日-哈市雪花
  7. 程序员光会敲代码已经不行了 思维方式更重要,尤其是第二种!!
  8. 用java实现汉字的笔画数
  9. chatgpt4模型介绍
  10. 北京大学信息科学技术学院本科生课程体系(修订版)