变量的概念

关于变量的概念:
变量提供了程序可操作的有名字的存储区。
C++中每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储与该内存中的值的取值范围以及可应用在该变量上的操作集。
变量称为“变量”或“对象”(object):对象是在内存中具有类型的区域。
Ⅰ)左值&右值
左值:出现在赋值语句的左边或右边。
右值:只能出现在赋值语句的右边。
tips:
①变量是左值,因此可以出现在负值语句的左边。
②数字字面值是右值,因此不能被负值。
③有些操作符,比如赋值,要求其中一个操作数必须是左值。
④左值出现的上下文决定了左值是如何使用的。
⑤左值和右值的使用影响整个程序的操作和/或性能——特别是在向函数传递值或从函数中返回值的时候。

Ⅱ)实例:理解表达式
units_sold=units_sold+1;
units_sold被用作两种不同操作符的操作数。
+操作符仅关心其操作数的值。变量的值是当前存储在和该变量相关联的内存中的值。
=操作符读取有操作数并写到做操作数。
在这个表达式中,加法运算的结果被保存到与untis_sold相关联的存储单元中,而untis_sold之前的值被覆盖。

Ⅲ)变量名:标识符(identifier)
tips:
①包含多个词的标识符书写为在每个词之间添加一个下划线,或者每个内嵌的词的第一个字母都大些,常用studentLoan而非studentloan。

Ⅳ)定义对象
每个定义都是以 类型说明符(type specifier)开始,后面紧跟着以逗号分开的含有一个或多个说明符的列表。分号结束定义。
tips:
①初始化:变量定义指定了变量的类型和标识符,也可以为对象提供初始值。
C++支持两种初始化变量的形式: 复制初始化直接初始化
复制初始化:
int ival(1024);
直接初始化: 
int ival=1024; //更灵活,效率更高
当初始化类类型的对象时,复制初始化和直接初始化之间的差别是很微妙的。
注意:C++中,初始化不是赋值!初始化指创建变量并给它赋值,而赋值则是擦除对象的当前值并用新值来代替(覆盖)。
②使用多个初始化式:
a/初始化内置类型的对象只有一种方法:提供一个值,并且把这个值复制到新定义的对象中。
对内置类型来说,复制初始化和直接初始化几乎没有差别。
b/对类类型的对象来说,有些初始化仅能用直接初始化完成。
每个类都可能会定义一个或几个特殊的成员函数来规定如何初始化类类型的变量。
定义如何初始化的成员函数称为 构造函数(constructor)
tips:
.①构造函数能接受多个参数。
.②一个类可以定义几个构造函数,每个构造函数必须接受不同数目或不同类型的参数。
.③实例:string类型在标准库中定义,用于储存不同长度的字符串。其定义了几个构造函数,使我们可以用不同的方式初始化string对象。
a/  两种定义都创建了string对象,其初始值都是指定的字符串字面值的副本。
     std::string titleA="C++ Primer 4th Ed.";
     std::string titleB("C++ Primer 4th Ed.");
b/ 也可以通过一个计数器和一个字符初始化string对象:本例中,初始化all_nines的唯一方法是直接初始化。
     std::string all_nines(10,'9');  //all_nines="9999999999"
.④有多个初始化式时不能使用复制初始化。
③初始化多个变量:
当一个定义定义了两个以上的变量时,每个变量都可以有自己的初始化式。
tips:
.①可以用同一个定义中前面已定义变量的值初始化后面的变量。
.②已初始化变量和未初始化变量可以在同一个定义中定义。
.③对象可以用任意复杂的表达式(包括函数的返回值)来初始化:
     double price=109.99 , discount=0.16;
     double sale_price=apply_discount(price,discount);
本例中,函数apply_discount接受两个double类型的值并返回一个double类型的值。
将变量price和discount传递给函数,并用它的返回值来初始化sale_price。

Ⅴ)变量初始化规则
当定义没有初始化式时,系统会自动初始化变量,其提供何值取决于变量的类型及变量定义的位置。
1)内置类型变量的初始化:是否自动初始化取决于变量的位置。
①在函数体外部定义的变量均初始化为0;
②在函数体里定义的内置类型变量不进行初始化;
③除了用作赋值操作的左操作数,未初始化变量用作任何其他用途都是没有定义的;
④永远不要依赖未定义行为!
/*警告:未初始化的变量引起运行问题*/
①编译器并未被要求去检测未初始化变量的使用;
②造成程序崩溃或程序运行完毕却产生错误的结果;
③原因:未初始化的变量实际上都有一个值。
编译器把该变量放到内存中的某个位置,而把这个位置的无论哪种位模式都当成是变量初始的状态。
当被解释为整型值时,任何位模式都是合法的值,尽管此值非程序员所需。
由于该值合法,使用它不会导致程序崩溃,可能的结果是程序错误执行/错误计算。
2)类类型变量的初始化:若某个类的变量没有提供初始化式,不论变量在哪里定义,将使用 默认构造函数
①大多数类都提供了默认构造函数;
②若类具有默认构造函数,可在定义该类的变量时不显式地初始化变量,如string类定义了默认构造函数来初始化string变量为空字符;
③若类类型没有默认构造函数,则每个该类对象的定义都必须提供显式的初始化式。

Ⅵ)声明和定义
为了让多个文件访问相同的变量,C++区分了声明和定义。
变量的 定义(definition):为变量分配存储空间,还可以指定初始值。在一个程序中,变量有且只有一个定义。
变量的声明(declaration):向程序表明变量的类型和名字。
tips:
①可以通过使用extern关键字声明变量而不定义它。
不定义变量的声明包括对象名、对象类型和对象类型前的关键字:
extern int i ; // declares but does not defines i
int i ; // declares and defines i
②extern声明不是定义,不分配存储空间,它只是说明变量定义在程序的其他地方。
程序中变量可以声明多次,但只能定义一次。
初始化式必须要有存储空间来进行初始化,因而只有定义(能分配存储空间)可以初始化变量而声明不能。
③若声明有初始化式,则可被当作定义,即使声明标记为extern:
extern double pi=3.1416 ; // definition
④只有当extern声明位于函数外部时,才可以含有初始化式。
extern double pi=3.1416 ;             //definition
double pi ;                           //error:redefinition of pi
extern double pi ;                    // ok:declaration not definition
extern double pi=3.1416 ;             //error:redefinition of pi
在C++语言中,变量必须且仅能定义一次,而且在使用变量之前必须定义或声明变量。
任何在多个文件中使用的变量都需要由与变量分类的声明,即一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明。

Ⅶ)名字的作用域
C++程序中,每个名字都与唯一的实体(如变量、函数和类型等)相关联。
用来区分名字的不同意义的上下文称为 作用域(scope)
作用域是程序的一段区域,一个名称可以和不同作用域的不同实体相关联。
tips:
①大多数作用域都是用花括号{}界定的。一般来所,名字从其声明点开始直到其声明所在的作用域结束处可见。
#include <iostream>
int main( ){
      int sun=0 ;
      for( int val = 1 ; val <= 10 ; val ++)
           sum += val ;
      std::cout << "Sum of 1 to 10 inclusive is"
                     << sun << std::endl ;
      return 0 ;
}
程序定义了一个名为main的函数,以及两个名为sun和val的变量。
.①名字main定义在所有花括号之外,整个程序可见:
定义在所有函数外部的名字具有 全局作用域(global scope),可以在程序的任何地方访问;
.②名字sum定义在main函数的作用域中,在整个main函数中都可访问,但在main函数外则不能,其具有 局部作用域(local scope)
.③名字val定义在for语句的作用域中,只能在for语句中使用,具有 语句作用域(statement scope)
②C++中作用域可嵌套:全局作用域>局部作用域>语句作用域:
名字可在内部作用域中重新定义。理解和名字相关联的实体需要明白定义名字的作用域:
#include <iostream>
#include <string>
std::string s2 = "hello" ;                      // s1 has global scope
int main( ){
     std::string s2 = "world" ;                 // s2 has local scope
     // use global s1; prints "hello world"
     std::cout << s1 << " " << std::endl ;
     int s1 = 42 ;                              //s1 is local and hides global s1
     // use local s1; prints "42 world"
     std::cout << s1 << " " << s2 << std::endl;
     return 0 ;
}
该程序定义了三个变量:string类型的全局变量s1、string类型的局部变量s2和int类型的局部变量s1。
局部变量s1的定义 屏蔽(hide)了全局变量s1。
.③C++还有另外两种不同级别的作用域: 类作用域(class scope)和命名空间作用域 (namespace scope)

Ⅷ)在变量使用处定义变量
①在对象第一次被使用的地方定义对象可以提高程序的可读性。
②放置声明的一个约束是,变量只在从其定义处开始到该声明所在的作用域的结束处才可访问。
③必须在使用该变量的最外层作用域里面或之前定义变量。
请使用手机"扫一扫"x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值