C++中的变量和常量

变量与常量


一、变量

变量提供了一个拥有名字和为程序提供数据的可存储空间。而变量的数据类型决定着变量所能占据的内存空间的大小、数据怎么存储、被存储数据值的范围以及所能参与的运算。一般情况下,变量和对象这两个名词是等价的,均指一块能存储数据并具有某种类型的内存空间。
1、声明与定义
由于C++支持分离式编译,也就是可以将程序分为多个文件来进行编译,当一个文件中需要使用另一个文件中定义的变量时,就需要先告知程序使用使用的是哪个定义的变量。 声明就是通告程序变量的名字,使得程序可以使用别处定义的变量。定义是创建与名字相关的实体(开辟内存空间,甚至赋初值)。声明和定义均规定了变量的类型和名字。
//声明
extern int i;
变量定义的基本形式是:类型说明符+变量名列表,多个变量名之间以逗号分隔。类型说明符可以是基本内置类型、复合类型、自定义类型、标准库类型等,而变量名就是标识符。C++标识符由字母、数字、下划线组成。标识符不能以数字开头,长短无要求,但对大小写敏感(即大写和小写是不同的变量名)。
//声明并定义
// (type specifier)  variable_name;
int a, b, c; 

对于变量的命名,虽然C++标准中没有太多相关标准,大家按照基本要求可以对所要定义的变量取任何的名字,但随意取名往往增大了代码的可读性。所以有一些约定成俗的规范:

1)标识符要体现具体的含义,最好能望文生义,让人一看就知道变量的作用和含义;

2)变量名一般都小写,最好不要全部大写;

3)用户自定义的类名一般大写字母开头;

4)如果标识符由多个单词组成,单词之间有明显的区分,如单词开头大写、单词之间下划线连接。

2、初始化
初始化的含义是在创建变量的时候给它一个初始值,与赋值不同的是,赋值是用新的值将原有的值覆盖掉。初始化的四种方式:
int a = 0;
int a = {0};
int a(0);
int a{0};
列表初始化:用花括号来对变量进行初始化。当这种方式用于内置类型,一旦初始值存在丢失信息的风险则会发生错误。
默认初始化:如果定义变量是没有指定初值,则变量会被执行默认初始化。对于内置类型:如果定义于任何函数之外的变量被初始化为0,然而定义于函数内部的内置类型变量不会被初始化,于是变成变成了未定义的变量。对于类:每个了类决定了其初始化对象的方式。

二、常量

1、字面值常量
字面值常量就是我们一看它就知道它的值的常量,如42,0.5,‘a’,“abc”,true,false等。
给字面值常量添加前缀或者后缀,可以改变其默认类型:
字符和字面值常量:U, u, L, u8
整型字面值:u , U;l , L;ll , LL
浮点型字面值:F, f; l, L
2、const 限定符
利用关键字const对变量的类型加以限定,使对象变为常量,类似于C语言中的define功能。const对象只能执行不改变内容的操作。
const int bufsize = 1024;
1)初始化
const对象一旦创建后对象的值就不能改变,因此 const对象必须初始化。在对const对象进行初始化时,不必考虑用来初始化const对象的值是否是常量。
2)对常量的引用
对常量的引用进行初始化时,只要初始值可以转换为引用的类型即可,不必考虑被引用的类型是否是常量。也就是说,常量引用可以引用一个非常量,但是与普通的应用不同的是不能通过常量引用来改变对象的值。
3)指向常量的指针
对于常量的地址,只能使用指向常量的指针。而指向常量的指针也可以指向非常量,与对常量的引用类似,不能通过该指针改变对象的指,但不限制用其他方式改变对象的值。
4)常量指针
指针本身就是一个对象,因此可以将指针定义为常量。如果常量指针指向的是一个非常量,那么可以通过该指针改变对象的值。
5)顶层const和底层const
顶层const可以表示任何对象是常量,而底层const常与指针和引用等复合类型有关。当执行对象的拷贝操作时,拷入和拷出的对象都必须具有相同的底层const资格,或者两个对象的类型能够相互转换。
int i = 0;
const int *const p = i;//左边的const是底层const,右边的const是顶层const
6)constexpr和常量表达式
常量表达式指值不会改变并且在编译过过程就能得到就计算结果的表达式。字面值常量属于常量表达式;用常量表达式初始化的const对象也是常量表达式。可以将变量声明为constexpr类型,而且必须用常量表达式来初始化。
限定符constexpr作用于指针时,是将指针定为常量而不是指针指向的对象,这与const限定符的作用是不同的。

三、处理类型

1、类型别名
定义类型的别名可以简化复杂的类型名字,使用起来更加简便。通常有两种方法:
typedef  double  wages;//wages是double的别名
typedef  wages  *p;//p是double* 的别名
using d =  double;//d是double的别名
2、auto 类型说明符
auto类型说明符是让编译器通过初始值来推断变量的类型,因此auto 定义的变量必须拥有初值。
当auto的一条语句中含有多个变量时,该语句中德所有变量初始基本数据类型必须一致。
auto引用时,所获的类型是引用对象的类型,而非引用的类型。
auto一般会忽略顶层const而保留底层const。
3、decltype 类型指示符
decltype的作用是选择并返回操作数的数据类型。
decltype会返回操作数的顶层const,这一点与auto不同。
decltype也会返回操作数的引用类型,而不是引用对象的类型,因此使用该类型必须初始化。









  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值