详解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++常量引用语法上可以引用一个临时变量。这种方法在使用引用作函数参数和返回局部变量时有意义。我目前看来常量引用主要用在作函数参数或保证不修改原变量的时候。

相关文章

  • Microsoft Visual Studio 2022的安装与使用详细教程

    Microsoft Visual Studio 2022的安装与使用详细教程

    Microsoft Visual Studio 2022是Microsoft Visual Studio软件的一个高版本,能够编写和执行C/C++代码,具有强大的功能,是开发C/C++程序的主流软件,这篇文章主要介绍了Microsoft Visual Studio 2022的安装与使用详细教程
    2024-01-01
  • C++基础知识总结

    C++基础知识总结

    本文给大家汇总介绍了C++的一些基础知识,不管是对新手还是老鸟都有些帮助,希望大家能够喜欢
    2017-05-05
  • VC中BASE64编码和解码使用详解

    VC中BASE64编码和解码使用详解

    Base64是一种很常用的编码方式,利用它可以将任何二进制的字符编码到可打印的64个字符之中, 这样,不管是图片,中文文本等都可以编码成只有ASCII的纯文本。
    2015-11-11
  • C++二维数组螺旋加密信息

    C++二维数组螺旋加密信息

    大家好,本篇文章主要讲的是C++二维数组螺旋加密信息,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • VS编译出现MSB3073命令的解决方案

    VS编译出现MSB3073命令的解决方案

    =error MSB3073是Visual Studio编译器报出的错误,本文主要介绍了VS编译出现MSB3073命令的解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C++中事件机制的简洁实现及需要放弃的特性

    C++中事件机制的简洁实现及需要放弃的特性

    事件模型是被广泛使用的好东西,但是C++标准库里没有现成的,现在VC11可以用在XP下了,那么就痛快的拿起C++11提供的先进设施组合出一个轻便的实现吧感兴趣的朋友可以了解下,或许对你有所帮助
    2013-02-02
  • C语言游戏项目球球大作战实现流程

    C语言游戏项目球球大作战实现流程

    这篇文章主要为大家详细介绍了如何用C语言实现流行游戏球球大作战,文中示例代码介绍的非常详细,如果过程中有问题在文末还有视频讲解,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言中返回错误信息的相关函数用法总结

    C语言中返回错误信息的相关函数用法总结

    这篇文章主要介绍了C语言中返回错误信息的相关函数用法总结,包括strerror()函数和perror()函数以及ferror()函数的使用,需要的朋友可以参考下
    2015-09-09
  • 深入理解C++中的new和delete并实现对象池

    深入理解C++中的new和delete并实现对象池

    这篇文章主要介绍了C++中的new和delete并实现对象池,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 关于数据结构单向链表的各种操作

    关于数据结构单向链表的各种操作

    这篇文章主要介绍了关于数据结构单向链表的各种操作,关于数据结构链表的操作一般涉及的就是增删改查,下面将关于无空头链表展开介绍,需要的朋友可以参考下
    2023-04-04

最新评论