const在c与c++中的不同地位
来源:互联网 发布:打死不看右下角软件 编辑:程序博客网 时间:2024/05/19 22:05
我们都知道,const关键字是防止某个变量被修改的,即限定这个变量是只读的。C/C++中应用const会使程序的健壮性更高一些。
一、const修饰一般变量
在C中,const修饰一般变量是常变量,它具有变量属性,但同时,它又具有常性不可被修改。
在C++中,加const修饰以后变量就是个常量,不可被修改。
二、const修饰指针变量
先回想一下我们以前在C中写一段代码时传参的方式有传值和传址两种,但是大家也都知道传值的方式就是在函数内部做了一份临时拷贝,但出了这个函数的作用域临时变量就会被销毁。而利用指针传址的方式又不安全,例如下面这段代码:
//传址方式-----不安全void print2(int *pa){*pa = 20; //a的值会发生改变cout<<*pa<<endl; //输出为20}int main(){int a = 10;print2(&a);system("pause");return 0;}
这样,即便是一个简单的输出函数也会变得不安全,因此我们会加const使其变为安全的:
void print2(const int *pa)//注意这块的const一定在*左边而不是在*右边,*放在右边修饰的是a,说明这个a是不能被修改的{cout<<*pa<<endl; }
在c/c++中,const修饰指针变量时需要考虑const的位置:
这时就应该弄清楚一个概念:指针常量和常量指针
(1)常量指针:中心词是指针,用常量来修饰指针,其本质是一个指针,说明这个指针是一个指向常量的指针,即指针本身是可以修改的,但指针指向的变量不可修改
(2)指针常量:中心词是常量,用指针修饰,本质是一个常量,说明这个常量的值应该是一个指针,即指针本身的值是不能改变的,而通过指针指向的变量的值是可以改变的
int a = 1;int b = 3;const int *p = &a;//常量指针int const *p = &a;//常量指针int* const p = &a;//指针常量
C++中的const引用:
1.引用一个常量时,必须用const修饰——常量不可被修改
#include<iostream>#include<cstdlib> //在.cpp文件中使用.h头文件时,前边加上c并去掉.husing namespace std;int main(){const int &refn = 5;return 0;}
2.const修饰一个变量时:(先看一段错误代码)
int main(){const int n = 10;int &refn = n;return 0;}
refn作为n的引用,二者用的是同一个空间,按理来说,这一块空间只具有一个安全属性,要么是安全的要么是不安全的。但是从上边代码来看,n加了const保护不可被修改,但refn不具有安全属性,即它所代表的空间内容可被修改,这样就产生了矛盾。因此,要想refn称为n的引用,这里必须加上const保护。即:const int& refn = n;
3.const修饰一个引用时可以对该变量加以保护
int main(){int a = 0;const int &refa = a;refa = 10; //欲通过refa来改变a的值,system("pause");return 0 ;}引用加了const保护从而使a的这块空间不会被改变,增加了其安全属性。因此我们也可以将引用作为参数(由于不需要拷贝一份临时变量,效率会高一些):
//引用传参void print3(const int &refa){cout<<refa<<endl;}int main(){int a = 10;print3(a);system("pause");return 0;}
4.const修饰全局变量,不一定会为其开辟空间。
const修饰全局变量,不一定会为其开辟空间。如果不对n进行直接的操作,那么n这块空间是还没被开辟的,这时候const的作用和#define一样,在程序中仅仅只是替换n。只有在需要使用n所属的空间时系统才会开辟一块空间出来,因此,上边代码中的&n操作就会出现错误。(和底下这段代码作比较)
这段代码中需要用p指针指向n的这块空间的地址,编译器为其开辟了空间
5.引用的类型与已定义的变量类型不同
//这段代码是错误的
int main(){double d1 = 1.2;int &d2 = d1;system("pause");return 0 ;}
//这段代码在编译时只产生警告
int main(){double d1 = 1.2;const int &refd2 = d1;system("pause");return 0 ;}
从上边两端代码看得出,仅仅只有一个const之差,那么为什么会产生这样的差异呢?!我们接下来分析一下:
通过调试我们可以发现,d1和d2用的并不是同一块空间,说明d2根本就不是d1的引用。在这里其实是有一些变化的,当int类型的d2要作为double类型的d1的引用时,由于两者类型不同,会根据d1产生一个int类型的临时变量(匿名变量),而d2是这个临时变量的引用。临时变量一般是不能被修改的,因此在这里加了const。
因此,以后在变量与该变量的引用之间有类型变化时一定要加const修饰。
- const在c与c++中的不同地位
- const 在C/C++中的不同
- const 在c c++语言中的不同
- <C++>const在不同对象不同位置中的作用
- C 语言在计算机编程中的地位
- C语言在嵌入式中的地位
- const在C与C++中的区别
- const在C++与C中的区别
- const在C与C++中的区别
- c中的const与c++中的const
- C++const总结(出现在不同地方)
- const在C中的使用
- const在C中的使用
- const在c中的用法
- const在c中的用法
- 【C学习笔记】【疑问】关于const常量的实现机制在C和C++中的不同
- const——c与c++不同
- C与C++中的const
- Android平台语言支持状态
- Java 读写文件的三种流介绍
- git 官方教程(原文)gittutorial(7) Manual Page
- Win10无故自动重启解决方法
- Hadoop伪分布式模式安装部署
- const在c与c++中的不同地位
- Spring源码分析——AOP实现(2)
- 三角函数
- jstl标签中的fn与fmt标签的用法
- 移动端自定义提示框
- ActionBarSherlock 和 SlidingMenu 在Eclipse中的引入和使用
- RxJava 学习笔记(四)
- Laravel 日志
- CURL ERROR 7 Failed to connect to Permission denied