2.2 变量

2.2 变量

变量提供一个具名的、可供程序操作的存储空间。C++中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。对C++程序员来说,“变量(variable)”和“对象(object)”一般可以互换使用。

2.2.1 变量定义

变量定义的基本形式是:

首先是类型说明符(type specifier),随后紧跟由一个或多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。

列表中每个变量名的类型都由类型说明符指定,定义时还可以为一个或多个变量赋初值:

	int sum = 0, value, // sum、value和units_sold都是int
		units_sold = 0; // sum和units_sold初值为0
	Sales_item item;    // item的类型是Sales_item(参见1.5.1节)
	std::string book("0-201-78345-X");// book通过一个string字面值初始化

book的定义用到了库类型std::string,像iostream(参见1.2节)一样,string也是在命名空间std中定义的,我们将在第3章中对string类型做更详细的介绍。眼下,只需了解string是一种表示可变长字符序列的数据类型就可以了。C++库提供了几种初始化string对象的方法,其中一种是把字面值拷贝给string对象(参见2.1.3节),因此在上面的例子当中,book被初始化为0-201-78345-X

术语:何为对象?


C++程序员们在很多场合都会使用对象(object)这个名词。通常情况下,对象是指一块能存储数据并具有某种类型的内存空间。
一些人仅在与类有关的场景下才使用“对象”这个词。另一些人则已把命名的对象和未命名的对象区分开来,他们把命名了的对象叫做变量。还有一些人把对象和值区分开来,其中对象指能被程序修改的数据,而(value)指只读的数据。
大多数人的习惯用法是,认为对象时具有某种数据类型的内存空间。我们在使用对象这个词时,并不严格区分是类还是内置类型,也不区分是否命名或是否只读。

初始值

当对象在创建时获得了一个特定的值,我们说这个对象被初始化(initialized)了。用于初始化变量的值可以是任意复杂的表达式。当一次定义了两个或多个变量时,对象的名字随着定义也就马上可以使用了。因此在同一条定义语句中,可以用先定义的变量值去初始化后定义的其他变量。

// 正确: price先被定义并赋值, 随后用于初始化discount
double price = 109.99, discount = price * 0.16;
// 正确: 调用函数applyDiscount, 然后用函数的返回值初始化salePrice
double salePrice = applyDiscount(price, discount);

在C++语言中,初始化是一个异常复杂的问题,我们也将反复讨论这个问题。很多程序员对于用等号=来初始化变量的方式倍感疑惑,这种方式容易让人认为初始化是赋值的一种。事实上在C++语言中,初始化和赋值是两个完全不同的操作。然而在很多编程语言中二者的区别可以忽略不计,即使在C++语言中有时这种区别也无关紧要,所以人们特别容易容易把二者混为一谈。需要强调的是,这个概念至关重要,我们也将在后面不止一次提到这一点。
注意:初始化不是赋值,初始化的意义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。

列表初始化

C++语言定义了初始化的好几种方式,这也是初始化问题复杂性的一个体现。例如,要想定义一个名为units_sold的int变量并初始化为0,以下4条语句都可以实现:

	int units_sold = 0;
	int units_sold = {
   0};
	int units_sold{
   0};
	int units_sold(0);// 忽略颜色问题

作为C++11新标准的一部分,用花括号来初始化变量得到了全面应用。而在此之前,这种初始化的形式仅在某些受限的场合下才能使用。出于3.3.1节将要介绍的原因,这种初始化的形式被称为列表初始化(list initialization)。现在,无论是初始化对象还是某些时候为对象赋新值,都可以使用这样一组由花括号括起来的初始值了。
当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:

	long double ld = 3.1415926536;
	int a{
   ld}, b = {
   ld}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值