const关键字在(C和C++)中的用法

const在C语言中的用法

1.const是什么?

const是c语言中保留的关键字,用来定义常量,如果一个变量被const修饰,那它的值就不能被改变。

2.const的用法

一.修饰局部变量

(1)

const int n=1;
int const n=2;

 上述两种写法是一样的,都是标识变量n的值不能被改变,需要的是,用const修饰变量时,一定要给变量进行初始化,否则变量之后就不能在进行赋值。

(2)const修饰常量静态字符串

const char* str="abcdef";

如果没有const的修饰,可能会给str[5]=‘g’从新赋值,这样导致对只读内存区域的赋值,程序就会出现异常,有了cionst,这个错误就会被编译的时候立刻检查出来。

二.常量指针和指针常量

1.常量指针

常量指针有一下两种定义方式。其含义就是(指针指向的内容是常量)

const int * n; 
int const * n;

注意:

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

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

(2) 常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。

int a=10;
int b=20;
const int* n=&a;
n=&b;
 2.指针常量

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

int *const n;

注意:

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

int a=10;
int *p=&a;
int* const n=&a;
*p=20;
3.区别

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

4.指向常量的常指针

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

const int* const p;

三.修饰函数的参数

const修饰函数的参数可分为三种情况:

1.防止修改指针指向的内容
void init(char *left, const char *right);

给right 加上 const 修饰后,如果函数体内的语句试图改动 right 的内容,编译器将指出错误。

2.防止修改指针指向的地址
void swap ( int * const p1 , int * const p2 )

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

3.防止(修改指针指向的内容)和(修改指针指向的地址)
void init(const int * const a)

四.修饰函数指针的返回值

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

const char * GetString(void);

即必须这样接收函数返回值:

const char *str = GetString();

五.修饰全局变量

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


 

const在C++中的用法

const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。

在文c语言中已经讲到了(修饰基本类型,修饰指针,已经一些基本函数的类型)

下面主要针对修饰函数

一.cons修饰函数

1.const修饰函数返回值,就是不能修改返回值

(1)值传递

如果是值传递,就没必要将返回值用const修饰

const int func();

对于函数来说,它的返回值为一个int类型的值,是一个临时的值没有必要用const修饰。

(2)返回值为指针

如果返回值为指针,加上const修饰后,同样的内容是不可以修改的。

这时候接收的变量也必须是const修饰

const char* func();
char* str = func();// 错误的接收
const char* str = func(); //正确的
(3)返回值为引用

如果返回值为引用,也可以提高效率。但是一般返回引用的地方并不是很多,一般会出现在类的赋值函数中。而且,用const 修饰返回值为引用类型的更少。一般来说不常用。

2.const修饰成员函数

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this 指针,表明在该成员函数中不能对类的任何成员进行修改.

class Date
{
  public:
   
     void Display()const

   { 
     cout<<_year<<"-"<<_month;
     cout<<"-"<<_day<<endl;  
   }
  
  private:
     int _year;
     int _month;
     int _day;

}

其中this指针的类型为: Date*const-->this的指向不能修改,this指向空间中的内容可以修改。

所示被const修饰成员函数类型 也可以写成为const Date *const 。

3.const函数的规则

1.const 对象只能访问const 成员函数,非const 的对象可以访问任何成员函数,包括const 成员函数。
2.如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数。
3.const成员函数可以访问所有成员变量,但是只能访问const的成员函数。
4.非const成员函数,可以访问任何成员,包括const成员成员函数。
5.const成员函数不能修改任何的成员变量,除非变量用mutable修饰。

三.使用const的好处

1.可以定义const常量

这样可以避免由于无意间修改数据而导致的编程错误,提供了一个保护作用。

2.便于进行类型检查

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

3.为函数重载提供了一个参考

const修饰的函数可以看作是对同名函数的重载。

4.可以节省空间,避免不必要的内存分配

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象宏一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而宏定义的常量在内存中有若干个拷贝。

5.提高了效率

编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期的常量,没有了存储与读内存的操作,使得它的效率也很高。

四.const在c和c++中的区别

对比一:

1.C语言中const是定义了一个const变量,该变量只具备读的功能,不具备写的功能。

2.C++中const是定义了一个常量。

const int a = 5;
int array[a]; //在C语言中编译错误,因为a是一个变量
int array[a];//在C++中正确,因为a是一个常量

对比二:

  • C语言中不能定义const函数,而C++中可以定义const函数
  • C++中的const成员函数:不能修改类的成员变量的值。
int main()
{
    const int a = 10;
    int *p = NULL:
    p = (int*)&a;
    *p = 20;
    printf("%d\n",a);
}

 其中在c中结果为20    c++中结果为10

问题:c++中结果为10对嘛

如果你认为没有被修改,那么你就错了,这里的10是错误的,printf打印的时候是在寄存器上获取的,而内存中的a已经被修改为20;

总结:const在C语言中修饰的变量的值是可以被修改的,而C++中被修改了,读取时需要到内存中读取,而不是从寄存器上获取。

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值