流是数据池的一种抽象表示,在程序执行时,每个流都关联着某个设备关联着数据源的流就是输入流,关联着数据目的地的就是输出流
插入运算符<<在编写涉及输入的程序时使用提取运算符>>
return 0;非0返回值是否起作用取决于调用该程序的系统
空白符:空格符、回车符、换页符、横向制表符、纵向制表符
标准C++不限制标识符的长度,但是只有前三十一个字符是有效的。此外标识符长度受C++编译系统的限制
用户自定义的标识符最好不要用系统定义的标识符如main sqrt等以及预处理指令中涉及的include、define等等
虽然允许给这些标识符定义新的意义但会使其失去原来的作用,从而产生歧义
按照不同的表示形式,可以将常量分为字面常量、符号常量、常值变量
字面常量也称直接常量,他们不存储在变量内存中
习惯上符号常量的标识符用大写字母,变量标识符用小写字母
常值变量是和符号变量相对的,常值变量需要通过const关键词定义,常量只能读不能修改,并且定义时必须初始化
推荐使用const而不是define预处理指令:1、const可以定义数据类型,以提高类型的安全性2、const既然是变量那么就有地址,适用面更广
八进制数通常是无符号的
C++中定义了三种整数类型,short int(2),int(4),long int(4)(在32位计算机中)
浮点型也叫实型,包括单精度,双精度,和扩展的双精度
float型只能提供6位有效数字
如果小数点前面或者后面的数为0,可以省略一个0,但不能同时省略,而且必须有小数点
C++中允许浮点数使用后缀fFlL,没有后缀的默认为double型
广义地讲,C++语言字符集中任何一个字符均可以用转义字符来表示
字符值是以ascll码的形式存放在变量的内存单元中的,因此可以把字符变量看成整形量,C++语言允许把字符变量按整形变量输出,也允许把整形量按照字符量输出,允许对整形变量赋以字符值,允许对字符变量赋以整型值
switch语句中判断表达式括号应具有整型值,一般为整型,字符型,枚举类型或者表达式。case后面的标号为常量表达式,其值必须是整型、字符型或枚举类型
main函数可以出现在任何位置,所有函数都是平行定义的,在一个函数内部不允许定义另外函数
有三种方式调用函数:函数表达式、函数语句、函数实参
函数值的类型和函数定义中函数类型应保持一致,如果两者不一致,则以函数类型为准,自动进行类型转换
函数调用过程中实际参数与形式参数匹配,首先精确匹配实参与形参的数据类型,如果不能精确匹配,则按照由低精度到高精度转换规则匹配(实际参数类型转换到形式参数类型),另外函数重载不能靠函数返回值类型来区别,因为调用时体现不出函数返回值类型
默认参数也称为缺省参量,函数定义中的每一个参数都可以拥有一个默认值,如果在函数调用中没有为对应默认值的参量提供实参数据,系统就直接使用默认值
默认参数定义的顺序为自右向左,即如果一个参数设定了缺省值时,其右边的参数都要有缺省值
定义数组中方括号中的常量表达式表示数组元素的个数,也称数组的长度
数组名实际上就是第一个元素的地址,不代表变量值,而且是一个常量不能修改
引用数组越界时,运行时并不报错(c++语言为了提高效率,因为检查是否越界要占用系统时间),但是使用时有可能会破坏其他数据
对于局部变量的数组,数组元素定义后,若不赋值,则值为由编译器指定的无意义的值
数组的初始化是在编译阶段进行的,这样将减少运行时间,提高效率
C++语言对数组的初始化赋值时,当{ }中的值个数少于元素个数时,未赋值的部分会置为与类型相关的特定值整型为0;浮点型为0.0;字符型为‘\0’
实际的硬件存储器是连续编址的,二维数组是按一维线性排列的
声明引用时,必须同时对其进行初始化
声明一个引用,不是新定义了一个变量,他只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元
对引用的限制:不能引用一个引用变量;不能创建一个指向引用的指针;不能建立数组的引用,因为数组是一个由若干个元素组成的集合,所以无法建立一个数组的别名
常引用:不能通过引用对目标变量的值进行修改
用引用返回一个函数值的最大好处是:在内存中不产生被返回值的副本
在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要是用在函数参数传递中,解决大块数据或对象传递效率低和空间开销大的问题
在引用传递函数的参数,能保证参数传递时不产生副本,提高传递效率,且通过const的使用,保证了引用传递的安全性
通过引用,会让函数返回值成为左值,在运算符重载部分会经常使用
类是面向对象技术的核心机制,是面对对象设计中对具有相同或相似性质的对象的抽象,是对数据和操作进行封装的载体
用同一类定义的对象,各对象的成员数据类型和成员函数类型完全相同,可以整体赋值
构造函数的作用:为对象分配空间并初始化、为数据成员赋值;请求其他资源
数组成员不能在初始化列表中初始化、static数据成员不能在初始化列表中初始化、非static的const数据成员必须在初始化列表中初始化
写在初始化列表中等价于简单变量的定义并且初始化;写在函数体中等价于简单变量先定义后赋值,写在初始化列表中的效率更高
在类中定义的析构函数在对象生命周期结束时自动执行,完成清理内存工作;并可以执行指定的其他操作
析构函数是一种在结束对象调用时自动执行的特殊的成员函数,一个类中只能定义一个析构函数
拷贝构造函数名和类名相同,参数是本类对象的引用,拷贝构造函数没有返回值
浅拷贝会带来堆区的内存重复释放
记住如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
浅拷贝只是拷贝对象空间,深拷贝可以拷贝对象空间之外申请的资源
如果构造函数有多个参数,则不能用在定义数组时直接提供所有实参的方法
成员函数通过this指针接收调用对象的地址,所以每个成员函数(非静态)都有一个隐含的指针变量this
静态数据成员存储在全局数据区,静态数据成员在程序一开始运行时就必须存在,静态数据成员定义时要分配空间,因此,需要在类外初始化静态数据成员,即使静态数据成员是私有的也要在类外初始化