const关键字和常量

注:以下大部分内容来源于 coursera 课程《C++程序设计》

const的用法

  1. 定义常量
const int max = 23;

const 与define的差别:const 和define 都可以定义常量,但是建议用const,因为它是有类型的。

  1. 定义常量指针
int n,m;
const int *p = &n;
* p  = 5 // 编译错误,不可以通过常量指针去修改所指向的内容
 p  = &m //编译正确,常量指针可以指向其他地址

常量指针与非常量指针的差别:

  • 不可以用过常量指针去修改所指向的内容。
int n,m;
const int *p = &n;
* p  = 5 // 编译错误,不可以通过常量指针去修改所指向的内容
 p  = &m //编译正确,常量指针可以指向其他地址
  • 不能把常量指针赋值给非常量指针。
const int *p1, int *p2;
p1 = p2; // 编译正确
p2 = p1; // 编译错误
p2 =  (int *)p1; // 强制转化,编译正确
  1. 定义常引用

引用

格式:类型名&引用名 = 某变量名;
作用:引用一个变量,等价于这个变量。两个中间只要有一个变另一个也会变。

int n = 4;
int &r = n;

r 引用了n, r的类型是 int &
注意:

  1. 定义引用时,一定要将其初始化成引用某个变量。
  2. 引用是从一而终的。初始化后,它就一直引用这个变量,不会再引用其他变量。
  3. 引用只能引用变量,不能引用常量和表达式。但是引用可以赋值。

例子:编写一个改变两个整型变量值的函数。

void swap(int a,int b)
{
int tmp;
tmp = a;
a= b;
b=tmp;
}
int n1,n2;
swap(n1,n2)

这个程序里,n1和n2的值没有改变。

void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a= *b;
*b=tmp;
}
int n1,n2;
swap(&n1,&n2) 

swap()里面的参数变成了n1,n2的地址,n1,n2会被交换。
现在用c++的引用来写,更加简便:

void swap(int &a, int &b)
{
tmp = a;
a= b;
b=tmp;
}
int n1,n2;
swap(n1,n2)

例子:引用作为函数的返回值

int n = 4;
int &SetValue() {return n;}
int main()
{
SetValue() = 40;
count <

SetValue()的返回值是一个整型的引用,它返回的值又是n,所以它的返回值是引用了n。SetValue() = 40是对一个函数调用的结果进行赋值,等价于对n进行赋值。

常引用

定义引用时,前面加const关键字,即为常引用。

int n;
const int &r = n;

特点是不能通过常引用去修改变量的内容,并不是说其引用的内容不能被修改:

int n = 100;
const int &r = n;
r = 200; //编译错误
n = 300; //编译正确

常引用和非常引用是不同类型的引用。

你可能感兴趣的:(const关键字和常量)