const
关键字
const关键字标识常量,标明const右侧的变量(本质是常量)不可变。
int const *b
标明 b是一个常量,不能通过b来改变值,但b本身是一个变量,可以改变b的值。
int * const b
标明b是一个常量,不能改变b的值,但能改变*b的值。
int a1 = 5;
int a2 = 10;
int const *b = &a1; //指针b指向a,并且不同通过*b来改变a的值,但可以改变b的指向。
int* const c = &a1; //指针c指向a,c的值是常量,不能改变c的指向。
a1 = 10; //正确
*c = 20; //正确
*b = 30; //错误:Read-only variable is not assignable
c = &a2; //错误:Cannot assign to variable 'c' with const-qualified type 'int *const'
const int * const
是一个指向常量的常量指针,及不可以改变指针的指向,也不可以改变指针本身的值。
int a = 10;
int b = 20;
const int * const p = &a;
p = 20; //错误:Cannot assign to variable 'p' with const-qualified type 'const int *const'
*p = 30; //错误:Read-only variable is not assignable
&
引用符号
一、引用简介
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
引用的声明方法:类型标识符 &引用名=目标变量名;
【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
说明:
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
ra=1; 等价于 a=1;
(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。
二、引用作为函数返回值
语法:类型 &函数名(形参列表){ 函数体 }
特别注意:
1.引用作为函数的返回值时,必须在定义函数时在函数名前将&
2.用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本
//代码来源:RUNOOB
#include<iostream>
using namespace std;
float temp;
float fn1(float r){
temp=r*r*3.14;
return temp;
}
float &fn2(float r){ //&说明返回的是temp的引用,换句话说就是返回temp本身
temp=r*r*3.14;
return temp;
}
int main(){
float a=fn1(5.0); //case 1:返回值
//float &b=fn1(5.0); //case 2:用函数的返回值作为引用的初始化值 [Error] invalid initialization of non-const reference of type 'float&' from an rvalue of type 'float'
//(有些编译器可以成功编译该语句,但会给出一个warning)
float c=fn2(5.0);//case 3:返回引用
float &d=fn2(5.0);//case 4:用函数返回的引用作为新引用的初始化值
cout<<a<<endl;//78.5
//cout<<b<<endl;//78.5
cout<<c<<endl;//78.5
cout<<d<<endl;//78.5
return 0;
}
网友评论