《C++Primer》 第二章 变量和基本类型

各种程序设计语言都具有许多独具特色的特征,这些特征决定了用每种语言适合开发哪些类型的应用程序。

程序设计语言也有一些共同的特征:
内置数据类型;
表达式和语句:用于操纵上述类型的值;
变量;
控制结构;
函数。

大多数现代程序设计语言都采用两种方式扩充上述基本特征集:
1.允许程序员通过自定义数据类型扩展该语言;
2.提供一组库例程,这些例程定义了一些并非内置在语言中的使用函数和数据类型。

基本内置类型

bool        布尔型         不定
char        字符型         8位
wchar_t     宽字符型       16位
short       短整型         16位
int         整型           16位
long        长整型         32位
float       单精度浮点型   6位有效数字
double      双精度浮点型   10位有效数字
long double 扩展精度浮点型 10位有效数字

命名习惯最重要的是保持一致。特别是在多人协同时。

变量名即变量的标识符(identifier),可以由字母、数字和下划线组成。必须以字母或下划线开头,且区分大小写字母。
变量名不能是C++关键字和操作替代名。
C++标准还保留了一组标识符用于标准库。标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。
有些标识符(在函数外定义的标识符)不能以下划线开头。

int 是C++内置类型,std::string是标准库定义的类型。

可以这样定义:
int month,
    day,
    year;

变量的初始化。
两种初始化变量的方式:复制初始化(copy-initialization)和直接初始化(direct-initialization)。
int ival(1024); 直接初始化
int ival = 1024; 复制初始化

初始化不是赋值。
初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。
它们两者的区别很微妙。直接初始化语法更灵活且效率更高。

使用多个初始化式
定义如何进行初始化的成员函数称为构造函数(constructor)。
std::string all_nines(10,'9');    all_nines = "9999999999"
这里,初始化all_nines的唯一方法是直接初始化。有多个初始化式时不能使用复制初始化。

初始化多个变量
对象的名字立即变成可见,所以可以用同一个定义中前面已定义变量的值初始化后面的变量。
已初始化变量和未初始化变量可以在同一定义中定义。两种形式的初始化文法可以相互混合。

double salary = 9999.9;
       wage(salary + 0.1);
对象可以用任意复杂的表达式(包括函数的返回值)来初始化:
double sale_price = a();

声明和定义
定义 用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且只有一个定义。
声明 用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。
使用extern关键字可以声明变量名而不定义它。
extern int i;     // declares but does not define i
int i;            // declares and defines i
extern声明不是定义,也不分配空间。它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,!!但只能定义一次。
如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern:
extern double pi = 3.1416;  //definition
只有当extern声明位于函数外部时,才可以含有初始化式。

名字的作用域

在程序中可以多次使用同一个名字,只要它用在不同的上下文中,且通过这些上下文可以区分该名字的不同意义。
用来区分名字的不同意义的上下文称为作用域(scope)作用域是程序的一段区域,一个名字可以和不同作用域中的不同实体相关联。
C++中,大多数作用域使用花括号来界定的。
定义在函数外部的名字具有全局作用域(global scope),可以在程序中的任何地方访问。
在函数内部定义的名字有局部作用域(local scope),只能在函数内部使用。
而在语句中定义的名字比如for语句有语句作用域(statement scope),只能在这个语句中使用。

C++中作用域可嵌套
定义在全局作用域中的名字可以在局部作用域中使用,而全局和局部的也可以在语句作用域中使用。即范围大的能在范围小的中使用。
名字还可以在内部作用域中重新定义。
局部变量的重定义能屏蔽(hide)全局变量。
但是局部变量最好使用不同的名字。

C++中海油另外两种不同级别的作用域:类作用域(class scope)和命名空间作用域(namespace scope)

通常把一个对象定义在它首次使用的地方是一个很好的方法。

const限定符
定义一个变量代表某一常数的方法仍然有一个严重的问题。即它可以被有意或无意地修改。
const限定符提供了一个解决办法,它把一个对象转换成一个常量。
const int bufSize = 512;
定义bufSize为常量并初始化为512.任何修改bufSize的尝试都会导致编译错误。

const对象末仍为文件的局部变量,可以加上个extern 指定为 全程序都可用。

引用(reference),间接引用,const引用。

typedef名字
typedef通常被用于以下三个目的:
为了隐藏特定类型的实现,强调使用类型的目的。
简化复杂的类型定义,使其更易理解。
允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。

枚举(enumeration),关键字 enum,枚举成员是常量,成员第一个默认为0,其后依次加1.

类类型
每个类(class)都定义了一个接口(interface)和一个实现(implementation)。
接口即该类所提供的操作。
class Sales_item
{
public:
    // 操作
private:
    std:string isbn;
    unsigned units_sold;
    double revenue;

}; //千万别忘了这个分号@

类可以为空,类体定义了组成该类型的数据和操作,成为类的成员(member),操作称为成员函数,而数据称为数据成员(data member)。
使用该类的代码可能只能访问public成员。

struct关键字,相当于class的public;
class中如果不写public和private,则默认为private;

头文件(header file)
多个文件分别编译(separate compilation),
头文件为相关声明提供了一个集中存放的位置。头文件一般包括类的定义、extern变量的声明和函数的声明。

头文件的好处:
保证所有文件使用给定实体的同一声明;
当声明需要修改时,只有头文件需要更新。

如果头文件太大,可能编译时间会很长,为了减少处理头文件的编译时间,可以预编译头文件。

注意,头文件用于声明而不是用于定义。只能是extern 类型 名字; //extern不能少,否则就是定义了。
对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知的const对象和inline函数。
这些实体可以在多个源文件中定义,只要都是相同的。

#include设施是C++预处理器(preprocessor)的一部分。在编译器之前运行。

头文件保护符(header guard)可以避免多重包含
#ifndef SALESITEM_H
#define SALESITEM_H
//
#endif
头文件应该含有保护符,即使这些头文件不会被其他头文件包含。
头文件如果被包含多次可能会引起难以理解的编译错误。

#include  <standard_header>
#include  "my_file.h"


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值