const

来源:互联网 发布:hadoop 数据倾斜 编辑:程序博客网 时间:2024/06/16 15:58

(1)const的作用

1.定义const常量

int const a=10;

const int b=10;

2.便于进行类型检查

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

void f(const int i)

{

}//对传入的参数进行类型检查,不匹配进行提示

3.可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。

void f(const int i)

{

i=10;//报错

}

4.为函数重载提供参考

class A

{

void f(int i){...}

void f(int i) const {...}//对上一个函数的重载

};

(2)const的使用

1.定义常量

int const a=1;或

const int a=1;

两者是一样的。类型描述符中如果有多个关键字,它们出现的位置不影响它对变量的限制。

2.作用在指针上

  (1)指针本身不可变,但所指内容是可变的

(char*) const p;或

const (char*) p;

 (2)指针可变,但所指内容不可变

const (char) *p;或

(char) const *p;

 (3)两者都不可变

const char* const p;

 (4)上述如何区别?

关键只有一句话:*的左边是指向类型,右侧是对变量的修饰。

1)[] () *在数据定义时与在表达式中的优先级一样的理解。

int* a[10];//因为[]的优先级高于*,所以是一个数组,每个成员是一个指向整形的指针

int (*a)[10];//因为()的优先级高于[],所以先看里面,是一个指针,指向一个数组。

(2)对指针类型的判断是从右向左。

*的左边是指向类型,右侧是对变量的修饰。

const int* a;//*的左边是const int,即指向的数据不可修改。右边没有修饰符,为普通指针。

int* const a;//*的左边是int,指向的类型为int型的变量,即指向的数据可以被修改。*的右边是const,说明a指针是只读的。

int const* const a;//*右边要const,因此指针不可修改,*左边int const是指针指向的类型,仍然是不可修改的

如果const位于*的左侧,即指针指向的类型为常量。

如果const位于*的右侧,则const就是修饰指针本身,即指针本身是常量。

(3)函数中使用const

1.const修饰参数

(1)参数在函数体内不可改变。

void fun(const int a);//没什么意义,因为本身就是形参

(2)参数指针所指内容为常量,不可改变。

void fun(const char* p);

(3)参数指针本身为常量,不可改变。

void fun(char* const p);//同样没有意义

(4)存储位置

typedef void* VP;

const void* ptr;

const VP ptr;

typedef是自定义一种数据类型,要与define区分开,define是一种简单的替换。
所以VP是类型名字,void*是VP的真实类型。
const VP ptr的理解是:const void* ptr,但是void*是一个整体,如int、double一样,所以等价于void* const ptr,即ptr是一个常量,存储在只读区。
而const void* ptr中,ptr只是一个普通的变量指针。
所以两者的存储位置不一样。
(5)总结
1. 用途
(1)向其它程序员传递一个信息,这个不要修改
(2)有可能使编译器产生更紧凑的代码,减少bug
(3)合理保护只读数据,避免错误。
2.使用位置
(1)定义常量,防止被修改。
(2)函数参数中,如果不期望子函数去修改被调函数的某些数据,可以另以限制。例如:

char* strcpy(char* dest,const char* src)

char* strncpy(char* dest,const char* src,size_t n)

0 0
原创粉丝点击