龙空技术网

C++|常量指针、指针常量与const

小智雅汇 756

前言:

今天大家对“c语言的const”大约比较注重,各位老铁们都想要了解一些“c语言的const”的相关知识。那么小编同时在网络上汇集了一些关于“c语言的const””的相关文章,希望大家能喜欢,咱们一起来了解一下吧!

对于指针,我们需要明确的是,它涉及到两个变量,一是指针本身,它是一个4字节的变量,存储一个指向另一个变量的地址;二是指针所指向的变量。

const是一个变量的限定词,表示一个常量,一个不可以修改的变量,来自英文字constant。

const也可以修饰参数,作为输入参数。修饰函数,可以防止意外的改动。修饰类的成员函数,不改变类中的数据成员。在C++程序设计中,如果能用const的地方,就尽量用,防止编写时意外修改而出错

const修饰的可以是指针本身或指针所指向的变量,取决于const与指针符号*的相对位置:

序号代码const与*号位置类型const修饰对象说明

int b=500;

1const int* a = &b;const左*右常量指针指针指向的变量*a是一个整体;2int const *a = &b;同上同上同上

3int* const a = &b;*左const右指针常量指针本身*a被分割;4const int* const a = &b;

都是常量第1种情况:

*a是一个整体,const修饰的是*a,所以*a赋了初值后,不能再变更:

int b = 500;

const int* a = &b;

*a =600; //错误

通过改变b的值来改变*a是允许的:

int b = 500;

const int* a = &b;

b = 600;

cout << *a <<endl //输出600

当然a是指针本身,没有被const修改,是允许值变更的:

int b = 500;

int c = 600;

const int* a = &b;

a =&c;

cout << *a <<endl //输出600

常量指针可以先不初始化,因为虽然指针内容是常量,但指针本身不是常量。

const int *a ; //正确

第2种情况:

与第1种情况相同。

第3种情况:

表示指针本身是常量,不能对指针本身进行更改操作,而指针所指向的内容不是常量。

int b = 500;

int c = 600;

int const *a ; //错误,没有初始化

int const *a = &b; //正确,必须初始化

*a = 600; //正确,允许改值

cout << a++ <<endl //错误,指针是常量,不允许更改

const与成员函数

const也可以修饰成员函数,如:

class Point

{

int xVal, yVal;

public:

int GetY() const;

};

int Point:GetY() const

{

return yVal;

}

上述成员函数类似“只读”函数,不改变类的数据成员的值。

如果const放在函数声明之前呢?则表明函数的返回值是常量。

const与#define

C++可以用const定义常量,也可以用#define定义常量,但前者比后者有更多的优点。

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

补充:

常量的引进是在早期的C++版本中,当时标准C规范正在制订。那时,常量被看作一个好的思想而被包含在C中。但是,C中的const的意思是“一个不能被改变的普通变量”。在C中,它总是占用内存,而且它的名字是全局符。C编译器不能把const看成一个编译期间的常量。

在C中,以下写法是错误的:

const bufsize = 100;

char buf[bufsize];

因为C编译器不知道它在编译时的值。在C语言中可以选择以下书写:

const bufsize;

但以上写法在C++中是不对的,而C编译器则把它作为一个声明,这个声明指明在别的地方有内存分配。因为C默认const是外部连接的,C++默认const是内部连接的,这样,如果在C++中想完成与C两样的事情,必须用extern把内部连接改成外部连接:

extern const bufsize;

-End-

标签: #c语言的const