flashfxp 网站,wordpress推广积分插件,阿里云虚拟主机wordpress发送邮件,wordpress美图模板1、const用于C – 运行时常量
a. 修饰变量 修饰变量为常变量#xff08;只读变量#xff09;
const int i 10;
此时i还是一个变量#xff0c;不信你可以把它用来当作定义一个数组时的数组长度#xff0c;一定会报错。不过它具有一种常属性#xff0c;它的值一直都…1、const用于C – 运行时常量
a. 修饰变量 修饰变量为常变量只读变量
const int i 10;
此时i还是一个变量不信你可以把它用来当作定义一个数组时的数组长度一定会报错。不过它具有一种常属性它的值一直都是10不是发生改变当然有人会说我有办法使它改变因此我们说它是常变量或叫作只读变量因此我们一定要记住在定义只读变量时要把它初始化为我们想要的值。
因此我们的代码中千万不要出现这种低级错误数组的长度是一个常量表达式尽管const修饰的变量是一个常变量但它本质上仍然是一个变量
int a 10;
int arr[a] { 0 };
前面说了此时i的值其实有办法改变那么怎么改变呢
const int i 10;
int *pi i;
*pi 20;
上面是利用了指针的方式改变了i的地址空间里的内容从而使i的值发生了改变。说到指针想起了一个const位置不同而修饰对象不同的问题看看下面这段代码const都分别修饰什么
const int *p;
int const *p;
int *const p;
const int *const p;
是不是心里已经一万个那什么在奔跑了别着急其实很简单的先忽略类型名编译器解析的时候也是忽略类型名我们看 const 离哪个近。“近水楼台先得月”离谁近就修饰谁。
const *p; //const 修饰*p,p 是指针 *p 是指针指向的对象不可变
const *p; //const 修饰*p,p 是指针 *p 是指针指向的对象不可变
*const p; //const 修饰 p p 不可变 p 指向的对象可变
const *const p; //前一个 const 修饰*p,后一个 const 修饰 p指针 p 和 p 指向的对象
都不可变
b. 修饰函数参数 修饰函数参数或返回值这儿的作用与修饰变量几乎一致都是不允许被修饰的对象的值发生变化。 因为许多的函数都不希望在函数内部的操作使函数参数的值发生变化那么我们就可以用const来修饰这些参数这里用一个库函数strcmp来说明
/***
*strcmp.c - routine to compare two strings (for equal, less, or greater)
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* Compares two string, determining their lexical order.
*
*******************************************************************************/#include cruntime.h
#include string.h#pragma function(strcmp)/***
*strcmp - compare two strings, returning less than, equal to, or greater than
*
*Purpose:
* STRCMP compares two strings and returns an integer
* to indicate whether the first is less than the second, the two are
* equal, or whether the first is greater than the second.
*
* Comparison is done byte by byte on an UNSIGNED basis, which is to
* say that Null (0) is less than any other character (1-255).
*
*Entry:
* const char * src - string for left-hand side of comparison
* const char * dst - string for right-hand side of comparison
*
*Exit:
* returns -1 if src dst
* returns 0 if src dst
* returns 1 if src dst
*
*Exceptions:
*
*******************************************************************************/int __cdecl strcmp (const char * src,const char * dst)
{int ret 0 ;while( ! (ret *(unsigned char *)src - *(unsigned char *)dst) *dst)src, dst;if ( ret 0 )ret -1 ;else if ( ret 0 )ret 1 ;
return( ret );
}2、const用于CPP – 编译时常量
a. 继承与C
C里面的const几乎有C语言的const的全部作用但有一点区别就是C语言里的const修饰的变量还是一个变量尽管它具有常属性但是C里的const修饰的变量就彻底“沦为”了一个常量这儿其实它的作用与#define很像因此在上面会发生错误的一个例子在这儿却能不会出错
const int a 10;
int arr[a] { 0 };
这儿它是正确的其实它就等价于
#define a 10
int arr[a] { 0 };
当然#define后面最好跟大写字母这儿为了与上面的例子统一就用了小写。 这儿也印证了C语言中的const是运行时常量C的const是编译时常量的说法。
b. const修饰类成员 const类成员在对象构造期间允许被初始化并且在以后不允许被改变。const类成员和一般的const 变量有所不同。const类成员是对应于每个对象而言它在对象构造期间被初始化在这个对象的生存周期中不允许被改变。
c. const修饰成员函数 const 成员函数不允许在此函数体内对此函数对应的类的所有成员变量进行修改这样可以提高程序的健壮性。const一般放在函数体后 functionType fun() const。
3、const在C和C中最大的不同是在C中const默认具有外部链接而C中则是内部链接。所以当你只在定义const常量的文件中使用该常量时c不给你的const常量分配空间此时const int c 0相当于#define c 0而在C中它会给每个const 常量分配内存空间。