const取自constant的缩写,本意是不变的,不易改变的意思

一.修饰普通变量

const int a = 7;

int b = a;         //正确

a = 8;             // 错误,不能赋值

二.修饰指针

int b = 500;
const int* a = &b;                     

int const *a = &b;   
                
这两种一样的,const修饰的是*a ,无法修改*a的值,*a指的其实是b的值

就是无法给*a赋值,*a=10会报错

但是能给b赋值,而且赋值后*a也会跟着变,但是不管如何只能读取*a,而不能给*a赋值

int* const a = &b;

const修饰的是a,既指针本身,就是a(地址)无法被修改,但是*a可以变,b也可以变

const int* const a = &b;  

为指针本身和指向的内容均为常量

三.修饰类的成员函数时

为什么仅仅说是类中的成员函数?因为非成员函数不能用const修饰,在cpp文件下直接写一个函数带const会报错

在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数。为什么不能调用非const函数?因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。

class A
{
private:
int i;
public:
void setnum(int n) //set函数需要设置i的值,所以不能声明为const
{
i = n;
} int getnum() const //get函数返回i的值,不需要对i进行修改,则可以用const修饰。防止在函数体内对i进行修改。
{
//i = 30; 会报错,这句要删掉
//Func(); 这句也会报错,不能调非constd的函数,“对象含有与成员 函数 "A::func" 不兼容的类型限定符
return i;
} int Func()
{
return 0;
}
};

四.const修饰函数参数

1.防止传入的参数代表的内容在函数体内被改变,但仅对指针和引用有意义。

因为如果是按值传递,传给参数的仅仅是实参的副本,即使在函数体内改变了形参,实参也不会得到影响。如:

void fun(const int  i)

{

    i = 10;

}

在函数体内是不能改变 i 的值的,但是没有任何实际意义,因为按值传递实参的值本来就不会改变,加不加const没有区

2.const修饰的函数参数是指针时,代表在函数体内不能修改该指针所指的内容,起到保护作用

如下:在字符串复制的函数中保证不修改源字符串的情况下,实现字符串的复制

void fun(const char * src, char * des) //保护源字符串不被修改,若修改src则编译出错。

{                    

     strcpy(des,src);

}

而且const指针可以接收非const和const指针,而非const指针只能接收非const指针

3.const修饰引用时

当传参的类型为自定义类型,比如A是自定义的类,如下:

void fun(A a)

{



那么此时,传递进来的参数a是实参对象的副本,

要调用构造函数来构造这个副本,而且函数结束后要调用析构函数来释放这个副本,在空间和时间上都造成了浪费
所以函数参数为类对象的情况,推荐用引用。

但是按引用传递,又可能会造成安全隐患,通过函数参数的引用可以修改实参的内部数据成员,所以用const来保护实参,如下:

void fun(A& a)

{

}

五.修饰函数返回值

也是用const来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改,也常用于运算符重载。归根究底就是使得函数调用表达式不能作为左值。

class A
{
private:
int i;
public:
A()
{
i = 0;
}
int & get()
{
return i;
} const int & get_i()
{
return i;
}
}; void main()
{
A a;
cout << a.get() << endl; //数据成员值为0
a.get() = 1; //尝试修改a对象的数据成员为1,而且是用函数调用表达式作为左值。
cout << a.get() << endl; //数据成员真的被改为1了,返回指针的情况也可以修改成员i的值,所以为了安全起见最好在返回值加上const,使得函数调用表达式不能作为左值 a.get_i() = 1;//这一句会报错,因为是const修饰,不能修改函数返回值
}

 

C++ const修饰不同类型的用法的更多相关文章

  1. const 修饰成员函数 前后用法(effective c++ 03)

    目录 const在函数后面 const修饰成员函数的两个作用 const在函数前面 总结 const在函数后面 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态 ...

  2. const修饰this指针的用法

    #include <iostream> #include <string> using namespace std; class Base { }; class Excepti ...

  3. C/C++ 中 const 修饰符用法总结

    C/C++ 中 const 修饰符用法总结 在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家 ...

  4. [原创] 基础中的基础(二):C/C++ 中 const 修饰符用法总结

    在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家梳理一下知识,给大家一点点帮助.作者是菜鸟一 ...

  5. 转载----C/C++ 中 const 修饰符用法总结

    感谢原创作者,写的好详细.不忍错过,所以转载过来了... 原文地址: https://www.cnblogs.com/icemoon1987/p/3320326.html 在这篇文章中,我总结了一些C ...

  6. C++中const修饰基本数据类型、指针、引用、对象

    const修饰基本数据类型 #include <iostream> using namespace std; void main(){ const int a = 1; const cha ...

  7. const修饰规则 及其 用法

    const指针和指向const变量的指针,在写法上容易让人混淆,记住一个规则:从左至右,依次结合,const就近结合. 比如,int * const p: 1.int * (const p):变量p经 ...

  8. iOS 里const在修饰对象时候的用法

    玩iOS的小伙伴对const应该很不陌生, 在声明全局常量的时候很多时候都会用到, 但是有时候修饰对象很迷惑下面是个人总结, 下面的地址都是模拟的 1. const NSString *str1 = ...

  9. [Reprint]C++函数前和函数后加const修饰符区别

    c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...

随机推荐

  1. 1-电脑C盘(系统盘)清理

    推荐,亲测有效! 转自: https://baijiahao.baidu.com/s?id=1612762644229315967&wfr=spider&for=pc

  2. LeetCode 31. Next Permutation【Medium】

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  3. navicat远程连接报1045 access denied for user'root'@'ip'(using pasword:yes".............

    这个其实很简单,授权就行了.如下 1.GRANT ALL PRIVILEGES ON *.* TO'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;2 ...

  4. merge存储引擎基本介绍和使用规范说明

    [以下两段截自MySql手册]: merge存储引擎,也被认识为mrg_myisam引擎,是一个"相同“的表可以被当作一个表来用的myisam表的集合.“相同”意味着所有表同样的列和索引信息 ...

  5. 解析Mybatis入门第三天

    目的:使用mybatis对数据的一些标签的使用和表与表之间的一对多和多对一的查询方式. 例如:if.where.foreach 前言:同样是使用idea创建一个普通的maven工程(如何创建一个普通的 ...

  6. LOIC Download

    { //https://github.com/NewEraCracker/LOIC }

  7. 阿里云SaaS加速器“宜搭”发布宜搭Plus提升6倍研发效率

    9月26日,在杭州云栖大会上,阿里云SaaS加速器的“底座”——“宜搭”正式发布“宜搭Plus”低代码开发平台.开发复杂企业业务系统所需要的领域数据模型.逻辑&服务编排.专业UI页面设计等,都 ...

  8. H5 小代码(实时更新)

    :before { content: ''; display: inline-block; vertical-align: middle; height: %; } ↑  自适应垂直居中 .clear ...

  9. iframe 的那些事儿

    项目中有不少地方用到iframe,今儿把使用iframe遇到的一些问题一块儿总结一下. 1.javascript监听iframe加载完成事件 iframe加载过程需要一定时间,这个加载过程常常出现白屏 ...

  10. 深入分析Service启动、绑定过程

    Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...