考点一:const使用时的注意点
#include <stdio.h>
int main()
{
const int x = 1;
int b = 10;
int c = 20;
const int *a1 = &b;
int *const a2 = &b;
const int * const a3 = &b;
x = 2; // (错) const int x -------》 x是一个常量 不能改变x 的值
a1 = &c; // (对)const int *a1 -------> const 在int* 前面 说明指针指向的变量不能改变,即 指正指向常量
*a1 = 1; // (错)不能给常量赋值
a2 = &c; // (错)int *const a2 = &b -------> const 在 int* 后面说明指针不能改变
*a2 = 1; // (对)指针指向的值可以改变
a3 = &c; // (错)const int * const a3 ------> int* 的 前后 都有const 说明指针不能变,指针 指向的值 不能变
*a3 = 1; // (错)
}
考点二:const 与 #define 的特点及区别
例如 #define PI 3.1415926
程序编译的时候,编译器会首先将 #define PI 3.1415926 以后所有代码中的 PI 全部替换成 3.1415926,然后进行编译。
因此 #define 常量是一个 Compile-Time 概念,它的生命周期止于编译期,存在于程序的代码段,在实际程序中,它只是一个命令中的参数,没有实际的存在。
const常量是存在于程序的数据段,并在堆栈分配了空间。const常量是一个 Run-Time 的概念,它在程序中确确实实的存在并可以被调用、传递、const 常量有数据类型,而宏常量没有,编译器可以对 const 进行类型安全检查。
考点三:C++ 中的 const 的理解
(1) const 用于定义 常量:const 定义的常量编译器可以对其进行数据静态类型安全检查。
(2)const修饰函数形参:当输入参数为用户自定义类型和抽象数据类型时,应该将“值传递”改为 “const & 传递”
可以提高效率。
例如:
void fun (A a);
void fun (A const &a);
第一个函数效率较低,函数体内产生A类型的临时对象用于复制参数 a ,临时对象的构造,复制,析构过程豆浆消耗时间
用引用传递不需要产生临时变量,节省了时间,但是,光引用可能会改变 a,所以要加 const。
(3)const修饰函数的返回值:如 给"指针传递"的返回值加上 const ,则 返回值不能被直接修改,且返回值只能被赋值给加
const修饰的同类指针。
例如:const char * GetChar(void) {};
char *ch = GetChar(); // (错)
const char *ch = GetChar(); // (对)
(4)const 修饰类的成员函数(函数定义体):任何不会修改数据成员的函数都应用 const 修饰,这样,当不小心修改了
数据成员或调用了非 const 成员函数时,编译器都会报错。
const 修饰类的成员函数形式为:
int GetCount(void) const;