返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++编程中const的使用详解
  • 752
分享到

C/C++编程中const的使用详解

2024-04-02 19:04:59 752人浏览 独家记忆
摘要

目录1 概述:const和define的区别2. 修饰局部变量3. 常量指针与指针常量4. 修饰函数的参数5. 修饰函数的返回值6. 修饰全局变量总结1 概述:const和defin

1 概述:const和define的区别

先看一个典型的程序:

#include<iOStream>
using namespace std;
int main()
{
	int num = 1;
	#define t1 num + num
	#define t2 t1 % t1
	cout << "t2 is " << t2 << endl; // t2 is 2
	const int s1 = num + num;
	const int s2 = s1 % s1;
	cout << "s2 is " << s2 << endl; // s2 is 0
    return 0;
}

运行结果如注释所示,分别得到“t2 is 2”、“s2 is 0”???
分析原因:const定义的常量s1、s2,则s1的值是num+num,s2的值是s1%s1,所以最后结果为“s2 is 0”;而define定义的变量作替换后,c++把cout<<"t2 is "<<t2<<endl;语句译成了:cout<<"t2 is "<<num+num%num+num<<endl;所以结果为“t2 is 2”(1+0+1=2)

注意:define定义的内容,建议增加使用括号()

	#define t1 (num + num)
	#define t2 (t1 % t1)

具体分析define与const的区别,如下定义:

const float PI = 3.14;
#define PI (3.14)
  • 类型的安全性检查:const常量有数据类型,而define定义宏常量没有数据类型。则编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查(字符替换时可能会产生意料不到的错误,如上面的程序所示);
  • 调试:部分调度工具可以对const常量进行调度,但不能对宏常量进行调度;
  • 编译器的处理方式不同:define宏是在预处理阶段展开,const常量则是编译运行阶段使用;
  • 存储方式不同:define宏仅仅是展开,有几个地方使用则展开几次,不分配内存;const常量会在内存中分配地址(可以是堆中也可以是栈中);
  • 效率:define定义的常量在内存中有若干个拷贝;const定义的常量在程序运行过程中只有一份拷贝,甚至不为普通const常量分配存储空间,而是将它们保存在符号表中,相当于没有了读内存的操作,使得效率也很高。

2. 修饰局部变量

const约束对象的访问性质:使得对象只能读,不能写:不允许修改对象的值.

const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书籍建议:“Use const whenever you need”。

const int n=5;
int const n=5;

这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变脸初始化,否则之后就不能再进行赋值了。

// C     
const int num = 100;
(int *)&num = 4;   //可以间接修改

C的const表示修饰只读变量,但是我们可以恶意强制操作const对象。

接下来看看const用于修饰常量静态字符串,例如:

const char* str="fdsafdsa";

如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。

如下修改都是不允许的。

 // c++
 const int i = 0;   //是一个右值,有内存实体
 i = 11;          //错误:向只读变量‘i'赋值
 const int a{1.1}; //错误:从“double”转换到“int”需要收缩转换,请初始化成相同类型的常量

3. 常量指针与指针常量

常量指针是指针指向的内容是常量,可以有一下两种定义方式。

const int * n;
int const * n;

需要注意的是一下两点:

1、常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。

int a=5;
const int* n=&a;
a=6;

指针常量是指指针本身是个常量,不能在指向其他的地址,写法如下:

int *const n;

需要注意的是,指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。

int a=5;
int *p=&a;
int* const n=&a;
*p=8;

注意:区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线,如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。int const * n;是常量指针,int *const n;是指针常量。

指向常量的常指针

是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。

const int* const p;

4. 修饰函数的参数

根据常量指针与指针常量,const修饰函数的参数也是分为三种情况。

1、防止修改指针指向的内容

void StrinGCopy(char *strDestination, const char *strSource);

其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。

2、防止修改指针指向的地址

void swap ( int * const p1 , int * const p2 )

指针p1和指针p2指向的地址都不能修改。

3、以上两种的结合。

5. 修饰函数的返回值

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

例如函数:

const char * GetString(void);

如下语句将出现编译错误:

char *str = GetString();

正确的用法是

const char *str = GetString();

6. 修饰全局变量

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C/C++编程中const的使用详解

本文链接: https://lsjlt.com/news/144622.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C/C++编程中const的使用详解
    目录1 概述:const和define的区别2. 修饰局部变量3. 常量指针与指针常量4. 修饰函数的参数5. 修饰函数的返回值6. 修饰全局变量总结1 概述:const和defin...
    99+
    2024-04-02
  • C/C++编程中const如何使用
    这篇文章主要介绍“C/C++编程中const如何使用”,在日常操作中,相信很多人在C/C++编程中const如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C/C++编程中const如何使用”的疑惑有所...
    99+
    2023-06-29
  • C++和C中const的区别详解
    目录C中的constconst修饰局部变量const修饰全局变量const修饰的全局变量有外部链接属性const与指针C++中的constconst修饰普通全局变量const修饰普通...
    99+
    2024-04-02
  • C++成员函数中const的使用详解
    目录修饰入参值传递址传递const修饰入参修饰返回值修饰函数总结const 在C++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用...
    99+
    2024-04-02
  • 详解C++中的const和constexpr
    目录一.const常量与#define比较二.const修饰1.修饰普通变量,必须初始化2.修饰类变量和成员变量3.修饰成员函数4.修饰指针5.修饰引用三.const转换四.顶层co...
    99+
    2024-04-02
  • C++const的各种用法详解
    目录const的基本概念:一、const修饰基本数据类型 1.const修饰一般常量及数组  2.const修饰指针变量*及引用变量& ...
    99+
    2023-05-17
    C++ const用法介绍 C++ const用法 C++ const
  • C++中const如何使用
    本篇文章为大家展示了C++中const如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。const来修饰一个类的成员函数时,它并不仅仅是禁止修改类里面的数据,而且要求其里面用到的类的成员都是具有...
    99+
    2023-06-17
  • c++关键字const的用法详解
    目录C语言const的用法1、指向常量的指针变量const int *p指针指向int a;2、常指针(常地址)int * const p指针指向int a;3、指向常量的常指针co...
    99+
    2024-04-02
  • 详解C++ const修饰符
    目录概述 常对象常对象成员常成员函数常数据成员数据成员访问限制常对象修改的限制 常指针指向常变量的指针指向对象的指针小结对象的常引用 总结概述 cons...
    99+
    2024-04-02
  • c++中const的用法
    c++ 中 const 用法:声明常量对象,值不可修改。声明常引用,指向常量对象,引用本身不可指向其他对象。声明 const 成员函数,不能修改调用对象状态。定义常量表达式,值不可修改。...
    99+
    2024-05-15
    c++
  • C#中的Socket编程详解
    目录一,网络基础二,Socket 对象SocketTypeProtocolTypeAddressFamily三,Bind() 绑定与 Connect() 连接Bind()Connec...
    99+
    2024-04-02
  • C#中的const和readonly关键字详解
    const和readonly经常被用来修饰类的字段,两者有何异同呢? const 1、声明const类型变量一定要赋初值吗? 一定要赋初值 public class Student ...
    99+
    2022-11-13
    C# const关键字 readonly关键字
  • 详解Dev C++使用教程(使用Dev C++编写C语言程序)
    前面我们给出了一段完整的C语言代码,就是在显示器上输出“C语言中文网”,如下所示: #include <stdio.h> int main() { puts("C...
    99+
    2024-04-02
  • C语言详细讲解const的用法
    目录一、int const a / const int a二、const int(*p)/int const(*p)三、int*const p四、const用于函数的地址传递参数一、...
    99+
    2024-04-02
  • C++之const限定符详解
    const限定符:把变量定义成一个常量 1.使用const对变量的类型加以限定,变量的值不能被改变 const int bufSize=512;//输入缓冲区大小 bufSize...
    99+
    2024-04-02
  • C++中的const怎么用
    本文小编为大家详细介绍“C++中的const怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++中的const怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。const 是 constant 的缩写,...
    99+
    2023-06-27
  • const在c++中的作用
    const 关键字在 c++ 中用于定义常量,即程序运行期间值不可改变的变量,包括:声明常量变量,如 const int max_size = 100;防止意外修改,确保编译时检测修改并...
    99+
    2024-04-26
    c++ 代码可读性
  • const在c++中的用法
    c++ 中的 const 用于声明不可变的数据,即常量,确保变量或对象在声明后不能被修改,提升数据完整性,提高代码可读性,并允许编译器优化。主要用途包括:1. 确保数据完整性;2. 提高...
    99+
    2024-04-28
    c++ 代码可读性
  • C#中如何使用 const变量
    C#中如何使用 const变量,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。static readonly与C# const变量,作用是一样的,无论访问修饰符是不是public...
    99+
    2023-06-17
  • C语言中const如何使用
    这篇文章给大家介绍C语言中const如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。const可以说一种常量的声明的关键字,如const int a=2;变量a就是一个常变量,a的值不能被改变,这个改变是一定意义...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作