今天在写函数时,对函数的形参:“常变量引用”=“非常变量”(√)、“非常变量引用”=“常变量”(×)、…有点懵逼。。。所以,特别做了调试以彻底弄清这些问题!文章目录如下:
1 C++const常变量与引用综述
1.1 常变量
const常变量也叫只读变量,常变量在程序运行期间不能改变,定义时必须初始化(除初始化外不能作左值;初始化可赋“各种变”(这里你可调试),但不一定能作为定义数组的size)。常变量一般作函数参数(很推荐),还有常指针、常对象等。
注意符号常量(#define)于内存中不存在储存空间,但const常量存在(且能用szeof()
测长度,返回字节数),具有变量的特征(C++推荐用const常变量代替符号常量)。
1.2 引用
引用即别名,您使用引用就如同使用变量本身!引用必须在声明的同时初始化(除作为函数形参时——您想想也不可能是吧),并且不能有NULL引用(指针可以,但要防野指针鸭~)。一旦成为某个变量的引用,这种“绑定关系”便不能改变(非“常指针”可以随时改变指向)。
此外,C++参数传递方式原本只有一种:传值方式(形实参为变量、指针/地址)——形实参为指针时,传递的虽是地址但本质为传值(地址这种特殊的整型值),形参能刷新实参的内容,但不能改变实参的指向。有了引用之后便多了传址方式——实参虽为变量名,但传递的是变量地址。
2 常变量与非常变量间的赋值
int a = 1;
const int b = 2;
(1)常变量能赋给非常变量:
a=b; //正确
(2)非常变量不能赋给常变量(不作左值):
b=a; //错误
(3)非常变量能赋给常引用:
int c = 3;
const int &d = c; //正确
cout<<d<<endl; //3
c = 4; //c依旧可变
cout<<d<<endl; //4
(4)常变量不能赋给非常引用
const int e = 5;
int &f = e; //错误
(5)常变量能赋给常引用:
const int h = 6;
const int &i = h; //正确
因此,大部分时候,我们可酌情将函数形参定义为“常变量”&“常引用”
,即:
int func1(const int a) //实参可为:非常变量、常变量
{
//函数体
}
本质上:系统**忽略了**形参的const!!!
string func2(const string& str ) //实参可为:非常变量、常变量
{
//函数体
}
string func3(string & str) //实参可为:非常变量(但不能是常变量!)
{
//函数体
}
3 参考文献
郭有强,等.C++面向对象程序设计.北京:清华大学出版社,2009.