第二章 头文件、变量和基本类型(5)——变量

0x01 变量的定义


1、变量提供了一个具名的、可供程序操作的存储空间;

2、变量定义的基本形式是:类型说明符随后紧跟一个或多个变量名组成的列表,其中变量名以逗号分隔,以分号结束:

int a = 0, b, c = 1;          //a, b, c都是int类型的变量
string book(“My Company”);    //通过字面值显式初始化的string

初始值

1、当对象在创建时获得一个特定的值,我们说这个对象被初始化。用于初始化变量的值可以是任意复杂的表达式:

// 正确,price定义后被赋值,随后用于初始化discount
double price = 109.99, discount = price * 0.16;

// 正确,调用函数applyDiscount,然后用函数的返回值初始化salePrice
double salePrice = applyDiscount(price, discount);

2、初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。


列表初始化

1、在C++ 11的新标准中,用花括号来初始化变量得到全面应用。无论是初始化对象还是某些时候为对象赋新值,都可以使用这样一组花括号括起来的初始值,这种初始化的形式被称为列表初始化;

2、当用于内置类型的变量时,列表初始化有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器会报错:

long double ld = 3.1415926;
int a{ld}, b = {ld};    //错误,精度丢失,转换未执行
int c(ld), d = ld;      //正确,但精度丢失
 

默认初始化

1、如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”;

2、默认值是由变量类型决定的,同时定义变量的位置也影响默认值;

3、如果是内置类型的变量未被显式初始化,他的值将由定义的位置决定:定义于任何函数体外的变量被初始化为0,定义在函数体内部的内置类型变量将不被初始化;

4、一个未被初始化的内置类型变量的值是未定义的,如果试图拷贝或以其他形式访问该变量将引发错误;

5、建议初始化每一个内置类型的变量,虽然不是必要的,但可以确保后续程序的安全;

6、每个类都可以各自决定其初始化对象的方式,换句话说,类的对象如果没有显式地初始化,则其值由类决定。




0x02 变量声明和定义的关系


1、C++支持分离式编译,所以必须把声明和定义区分开来。声明使得名字为程序所知,定义负责创建与名字关联的实体;

2、C++是一种静态类型语言,其含义是在编译阶段检查类型。能这么做的前提是编译器必须知道每一个实体对象的类型,这就要求我们在使用某个变量之前必须声明其类型;

3、变量的声明规定了变量的类型与名字,在这一点上定义与之相同。除此之外,定义还申请存储空间,也可能会为变量赋一个初始值;

4、变量只能被定义一次,但可以被多次声明;

5、如果想声明一个变量而不定义它,可以在变量名之前添加关键字extern,而且不要显式初始化该变量:

extern int i;      //声明i而不定义i
int j;             //声明并定义j

6、任何包含了显式初始化的声明即是定义!如果给extern标记的变量赋值,这将抵消extern的作用:

extern int i = 0;    //这是一个定义!

7、在函数体内部如果试图初始化一个由extern标记的变量,将引发错误!





-----------(我是分割线)-----------

        这里的学习顺序基于《 C++ Primer(第五版)》,虽说这本书是C++神书,但如果没有一定的C语言基础,肯定很难一下子啃下来,特别是原书第一章说编写一个简单的程序,结果各种语句和输入输出流都出现了,最后还来个类简介,实在是有点让新手朦逼。就算有一定的C++基础,中文版的语言也略显拗口。

        所以,我建议可以先用谭浩强的C/C++系列高校用书籍来打个基础。先别管网上对谭教授的教材评价如何,至少它能高效地带你入门。直接学习C++不是不可以,但毕竟c语言是一门经典的计算机语言,经久不衰,还衍生出了很多其他的计算机语言。学好C语言能培养出一种理解计算机语言的思维模式,以后学其他语言都可能事半功倍。

        我个人的学习方式是“先看懂,后深入,再高效”。在这里会按照我的理解,尽量用简单的语言来解释C++的知识点,至少先看懂并让程序能用再说。如果有错欢迎指正。

        文中可能有某些程序段来自pezy大神,自学C++的路上我有很多疑难都是在pezy大神的解释中顿悟。在此表示感谢!

        任何地方如有侵权请立即联系删除。

-----------(我是分割线)-----------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值