详解C++中常量的类型与定义

2020-01-06 15:02:23丽君

当上面的代码被编译和执行时,它会产生下列结果:

复制代码 50
请注意,把常量定义为大写字母形式,是一个很好的编程实践。

 

常量的引用
如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作。对C++常量引用可以用其它任何引用来初始化;但不能改变。

关于引用的初始化有两点值得注意:

(1)当初始化值是一个左值(可以取得地址)时,没有任何问题;

(2)当初始化值不是一个左值时,则只能对一个const T&(常量引用)赋值。而且这个赋值是有一个过程的:

首先将值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,最后用这个临时对象来初始化这个引用变量。

例子:


double& dr = 1; // 错误:需要左值 
const double& cdr = 1; // ok 

第二句实际的过程如下:


double temp = double(1); 
const double& cdr = temp; 

作函数参数时:


// bc_temp_objects_not_bound_to_nonconst_ref.cpp 
// compile with: /EHsc 
#include "iostream" 
using namespace std; 
class C {}; 
void f(C & c) { cout << "C&" << endl; } 
void f(C const & c) { cout << "C const &" << endl; } 
int main() { 
f(C()); 
} 

结果:

 

复制代码 C const &

 

更直接的,用基本类型:


#include <iostream> 
using namespace std; 
void display(int const &ref) {cout<<ref<<'n';} 
int main() 
{ 
int i=1; 
display(i); 
int const anotheri=2; 
display(anotheri); 
display(2); 
display(1+2); 
display(static_cast<int>(3.14159)); 
} 

通过C++常量引用从函数返回一个局部对象:

一般从一个函数返回一个局部对象的引用是不对的: 
 


T & my_op ( void ) 
{ 
T t; 
return t; 
} // The T object t got destroyed here so the 
returned reference is not valid anymore.