C++源文件通常以.cc、.cxx、.cpp、.cp、.C作为后缀来命名
C++语言未定义输入输出语句,而是提供了一个全面的标准库来提供IO机制,对应 iostream、fstream、sstream
std::cout<<"Enter Two Numbers"<<std::endl;,这条语句执行了一个表达式,在C++中,一个表达式产生一个计算结果,它由一个或多个运算对象和一个运算符组成
::为作用域运算符,std代表命名空间
C++注释:双斜线注释//,界定符注释/* */
控制流语句:while语句、for语句、if语句,在Unix系统中,Ctrl+D代表文件结束符
一般而言,C++类的作者决定了类类型对象上可以使用的所有操作
item1.isbn(),其中涉及到点运算符、调用运算符
术语:公共语法特征的实现细节
C++内置类型:整型、浮点型、布尔型、字符型、空类型
带符号类型和无符号类型:除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的和无符号的两种。类型int、short、long和long long都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,例如unsigned long。类型unsigned int 可以缩写为 unsigned。与其他整型不同,字符型被分为了三种,char、signed char、unsigned char。类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。C++标准并没有规定带符号类型应如何表示,但是约定了在表示范围内正值和负值的量应该平衡,因此,8比特的signed char实际表示范围为-128至127
类型转换:对象的类型定义了对象能包含的数据和能参与的运算,其中一种运算被大多数类型支持,就是将对象从一种给定的类型转换为另一种相关类型
C++默认支持有损精度的类型转换,这方面Java会更严格一些,需要强转
在C++中,我们要尽量避免依赖于实现环境的行为,如果我们把int的尺寸看成是一个确定不变的已知值,那么这样的程序是不可移植的
含有无符号类型的表达式
不要给无符号对象赋一个负值,但是有一些隐含场景需要注意
- 无符号数和带符号的负值相加,带符号的负值会转换成无符号数;
- 从无符号数中减去一个值时,需要确保结果不能是一个负值,特别是用在循环判断的场景
- Java中不存在无符号类型
字面值常量
每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型
整型字面值:以0开头的整数代表八进制数,以0x或0X开头的代表十六进制,对应20、024、0x14,默认情况下,十进制字面值时带符号值,八进制和十六进制字面值即可能是带符号的也可能是无符号的。十进制字面值的类型时int、long、long long中尺寸最小的那个,前提是这种类型能容纳下当前的值。八进制和十六进制字面值的类型时能容纳其数值的int、unsigned int、long、unsigned long、long long、unsigned long long中的尺寸最小者。注意,类型short没有对应的字面值
浮点型字面值是一个double,字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用E或e标识:3.14、3.14E0、0.、0e0、.001
字符和字符串字面值
由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。字符串字面值的类型实际上是由常量字符构成的数组,编译器在每个字符串的结尾处添加一个空字符(‘\0'),因此字符串字面值的实际长度要比它的内容多1。如果两个字符串字面值位置紧邻且由空格、缩紧和换行符分隔,则他们实际上是一个整体
转义序列
由两类字符程序员不能直接使用,需要转义:一类是不可打印的字符,一类是C++语言中有特殊含义的字符(单引号、双引号、问号、反斜线)。我们也可以使用泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字。
指定字面值的类型
布尔字面值和指针字面值
true和false是布尔值的字面值;nullptr是指针字面值
变量定义:类型说明符+变量声明符
变量初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替
变量初始化的4种方式:
int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);
其中,用花括号来初始化变量的方式称为列表初始化,当用于内置类型的变量时,如果初始值存在丢失信息的风险,则编译器将报错
默认初始化
如果是内置类型的变量未被显示初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为0,定义在函数体内部的内置类型变量将不被初始化
定义于函数体内的内置类型的对象如果没有初始化,则其值未定义。类的对象如果没有显示地初始化,则其值由类确定
变量声明和定义的关系
为了允许把程序拆分成多个逻辑部分来编写,C++语言支持分离式编译机制,为了支持分离式编译,C++语言将声明和定义区分开来。声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。而定义负责创建与名字关联的实体
变量声明规定了变量的类型和名字,在这一点上定义与之相同。但是除此之外,定义还申请存储空间,也可能会为变量赋一个初始值。如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显示地初始化变量
变量能且只能被定义一次,但是可以被多次声明
标识符
C++的标识符由字母、数字和下划线组成,其中必须以字母或下划线开头。标识符的长度没有限制,但是对大小写敏感。C++语言保留了一些名字供语言本身使用,这些名字不能被用作标识符。同时,C++也为标准库保留了一些名字。用户自定义的标识符种不能连续出现两个下划线,也不能以下划线紧连大写字母开头。此外,定义在函数体外的标识符不能以下划线开头
作用域
作用域是程序的一部分,C++语言中大多数作用域都以花括号分隔
同一个名字在不同的作用域中可能指向不同的实体。名字的有效区域始于名字的声明语句,以声明语句所在的作用域末端为结束
嵌套作用域
作用域能彼此包含,被包含的作用域称为内层作用域,包含着别的作用域的作用域称为外层作用域
作用域中一旦声明了某个名字,它所嵌套着的所用作用域中都能访问该名字。同时,允许在内层作用域中重新定义外层作用域已有的名字。我们也可以显示的访问外层的变量,例如::reused。
复合类型