5、const关键字
1.>
C语言中的 const关键字
C语言中const所修饰的变量不是一个常量,是一个常变量或者说是一个只读变量,有自己的存储空间,是有地址的。被修饰的变量不能作为数组的下标。const修饰的变量可以被初始化,但不可直接修改其值,可以通过指针对其值进行修改。
//有自己的存储空间,可以通过指针对其内部的值进行修改。
#include <stdio.h>
int main()
{
const int a = 10;
int *p = &a;
printf("%d\n", a);
printf("%p\n", p);
*p = 30;
printf("%d\n", a);
return 0;
}
2.>
C++中的const关键字
C++中的const修饰的是一个真正的常量,定义的时候必须初始化,之后被放在常量区。可以做数组的下标。
可能分配存储空间,也可能不分配存储空间。
当const常量为全局,并且需要在其它文件中使用,会分配存储空间。
当使用&操作符,取const常量的地址时,会分配存储空间。
当const int &a = 10; const修饰引用时,也会分配存储空间 。
//使用&操作符,取const常量的地址时
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
const int a = 10;
const int* p = &a;
printf("%p\n", p);
return 0;
}
//当const int &a = 10; const修饰引用时
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
const int& a = 10;
printf("%p\n", &a); //当使用&操作符,取const常量的地址时,会分配存储空间。
return 0;
}
3>
const与#define
- C++中使用const代替#define
- < #define MAX 100 > //C语言的宏常量
- const int MAX=100; //C++语言的const常量
- const与#define的比较
- const常量有数据类型,而宏常量没有数据类型。
- 编译器可以对const进行类型安全检查。而对define只进行
字符替换,没有类型安全检查,并且在字符替换可能会产生
意料不到的错误。
- 使用const的另外一个好处是简单情况下进行常量折叠:
在编译时预先计算常量表达式的结果;例如:- const int s=3*100+20;使用时直接是结果 320。
6、引用
1、变量可以说是一段内存的引用,意思就是别名;然后引用则是变量的别名。是不会在开辟内存空间的。
int a = 10;
int &b = a;
2、引用的规则
1> 引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故而类型与原类型保持一致,且不分配 内存。与被引用的变量有相同的地址。
2> 声明的时候必须初始化,一经声明,不可变更。
3> 可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
4> &符号前有数据类型时,是引用。其它皆为取地址。
3、引用的用途
引用一般用在1、函数传参和2、返回值上。
#include <iostream>
using namespace std;
int &fun(int &a, int &b)
{
return a + b;
}
int main()
{
int a = 10;
int b = 20;
cout << fun(a, b) << endl;
return 0;
}
当引用作为函数返回值时注意:
1> 若返回栈变量:不能成为其它引用的初始值(不能作为左值使用)
2> 若返回静态变量或全局变量:可以成为其他引用的初始值(可作为右值使用,也可作为左值使用)
3> 不能返回局部变量的引用,不能返回局部变量的指针。
4、引用的本质
引用在C++内部实现是一个常指针。
例:int &a <==> int *const a;
5、const 引用
如果既要利用引用提高使用效率,又要保护传递给函数的数据不在函数中被改变,就应当使用常引用。
常引用的声明方式:
const 类型标示符 &引用名 = 目标变量名
常引用可以为其他不同类型的变量起别名,但此时会退化成一个指针
例:
double a = 10.01;
const int &b = a; //此时b在内存中是有空间的