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

 更新时间:2016年05月09日 15:49:50   作者:飞龙  
这篇文章主要介绍了详解C++中常量的类型与定义,使用#define与const来定义常量是C++入门学习中的基础知识,需要的朋友可以参考下

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。

整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
下面列举几个整数常量的实例:

212   // 合法的
215u  // 合法的
0xFeeL  // 合法的
078   // 非法的:8 不是八进制的数字
032UU  // 非法的:不能重复后缀

以下是各种类型的整数常量的实例:

85   // 十进制
0213  // 八进制 
0x4b  // 十六进制 
30   // 整数 
30u  // 无符号整数 
30l  // 长整数 
30ul  // 无符号长整数

浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含小数点、指数,或同时包含两者。当使用指数形式表示时,必须包含整数部分、小数部分,或同时包含两者。带符号的指数是用 e 或 E 引入的。
下面列举几个浮点常量的实例:

3.14159  // 合法的 
314159E-5L // 合法的 
510E   // 非法的:不完整的指数
210f   // 非法的:没有小数或指数
.e55   // 非法的:缺少整数或分数

布尔常量

布尔常量共有两个,它们都是标准的 C++ 关键字:

  • true 值代表真。
  • false 值代表假。

我们不应把 true 的值看成 1,把 false 的值看成 0。

字符常量

字符常量是括在单引号中。如果常量以 L(仅当大写时)开头,则表示它是一个宽字符常量(例如 L'x'),此时它必须存储在 wchar_t 类型的变量中。否则,它就是一个窄字符常量(例如 'x'),此时它可以存储在 char 类型的简单变量中。
字符常量可以是一个普通的字符(例如 'x')、一个转义序列(例如 '\t'),或一个通用的字符(例如 '\u02C0')。
在 C++ 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:

转义序列
含义
\ \ 字符
\' ' 字符
\" " 字符
\? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数
\xhh . . . 一个或多个数字的十六进制数

下面的实例显示了一些转义序列字符:

#include <iostream>
using namespace std;

int main()
{
 cout << "Hello\tWorld\n\n";
 return 0;
}

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

Hello World

字符串常量

字符串字面值或常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
您可以使用空格做分隔符,把一个很长的字符串常量进行分行。
下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。

"hello, dear"

"hello, \

dear"

"hello, " "d" "ear"

定义常量

在 C++ 中,有两种简单的定义常量的方式:

  • 使用 #define 预处理器。
  • 使用 const 关键字。

#define 预处理器

下面是使用 #define 预处理器定义常量的形式:

#define identifier value

具体请看下面的实例:

#include <iostream>
using namespace std;

#define LENGTH 10 
#define WIDTH 5
#define NEWLINE '\n'

int main()
{

 int area; 

 area = LENGTH * WIDTH;
 cout << area;
 cout << NEWLINE;
 return 0;
}

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

复制代码 代码如下:
50

const 关键字

您可以使用 const 前缀声明指定类型的常量,如下所示:

const type variable = value;

具体请看下面的实例:

#include <iostream>
using namespace std;

int main()
{
 const int LENGTH = 10;
 const int WIDTH = 5;
 const char NEWLINE = '\n';
 int area; 

 area = LENGTH * WIDTH;
 cout << area;
 cout << NEWLINE;
 return 0;
}

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

复制代码 代码如下:
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. 

特殊情况:返回一个常引用

const T & my_op ( void ) 
{ 
T t; 
return t; 
} 
const T & my_t_obj = my_op (); 

在这个情况下,局部变量 t 不会被直接析构,而是会保留到 my_t_obj 的生命周期结束为止。

总之,C++常量引用语法上可以引用一个临时变量。这种方法在使用引用作函数参数和返回局部变量时有意义。我目前看来常量引用主要用在作函数参数或保证不修改原变量的时候。

相关文章

  • 用C语言实现井字棋游戏代码

    用C语言实现井字棋游戏代码

    大家好,本篇文章主要讲的是用C语言实现井字棋游戏代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • 纯C语言:折半查找源码分享

    纯C语言:折半查找源码分享

    这篇文章主要介绍了纯C语言:折半查找源码,有需要的朋友可以参考一下
    2014-01-01
  • c语言处理函数调用的方法

    c语言处理函数调用的方法

    函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。这篇文章主要介绍了c语言是如何处理函数调用的?需要的朋友可以参考下
    2021-11-11
  • 如何用C语言画一个“圣诞树”

    如何用C语言画一个“圣诞树”

    这篇文章主要介绍了如何用C语言画一个“圣诞树”,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • C语言调用go生成的动态库的踩坑过程解析

    C语言调用go生成的动态库的踩坑过程解析

    这篇文章主要为大家介绍了C语言调用go生成的动态库的踩坑过程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • C++使用数组来实现哈夫曼树

    C++使用数组来实现哈夫曼树

    给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近
    2022-05-05
  • vc6.0中c语言控制台程序中的定时技术(定时器)

    vc6.0中c语言控制台程序中的定时技术(定时器)

    这篇文章主要介绍了vc6.0中c语言控制台程序中的定时技术(定时器),需要的朋友可以参考下
    2014-04-04
  • Reactor反应器的实现方法详解

    Reactor反应器的实现方法详解

    本篇文章是对Reactor反应器的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言线性表中顺序表超详细理解

    C语言线性表中顺序表超详细理解

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-03-03
  • 将 C++ 类型属性暴露给 QML

    将 C++ 类型属性暴露给 QML

    这篇文章主要介绍了将 C++ 类型属性暴露给 QML, QML 是一种基于 JavaScript 的声明式语言。在 Qt5中,QML有了长足进步,并且同 C++ 并列成为 Qt 的首选编程语言下面一起进入文章学习 QML的条件下也看看如何将将 C++ 类型属性暴露给 QML,需要的朋友可以参考一下
    2021-12-12

最新评论