关于C++基础部分的总结主要根据《C++ Primer》第五版来总结,主要是基础内容以及自己的理解
基本内置类型:
类型转换:就是将对象从一种类型转换成另外一种相关类型。当在程序的某处我们使用了一种类型而应该取另一种类型时,程序回自动进行类型转换,类型所能表示的范围决定了转换的过程。
当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的,此时程序可能继续工作、可能崩溃,也可能生成垃圾数据。因此我们要避免无法预知和依赖于实现环境的行为。
当一个算式表达式中既有无符号数又有 int 值时,那个 int 值就会转换成无符号数。把 int 转换成无符号数的过程和把 int 直接赋给无符号变量一样。把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。是先进行类型转换再计算。
变量:
列表初始化:下列四条语句都可以:
int units_sold = 0;
int units_sold = {0};
int units_sold(0);
int units_sold{0};
用花括号可以进行列表初始化,使用列表初始化若初始值存在丢失信息的风险,编译器会报错。
默认初始化:若果是内置类型的变量未被显示初始化:1.定义于任何函数体之外的变量会被初始化为0,在内部不会被初始化;2.每个类各自决定其初始化对象的方式,绝大多数类都支持无需显示初始化而定义对象,一些类要求每个对象都显示初始化。建议初始化每一个内置类型的变量。
变量声明和定义的关系:如果想要声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显示的初始化变量 ,任何包含了显示初始化的声明即成为定义。在函数体内部,如果试图初始化一个由extern关键字标记的变量将引发错误。变量能且只能定义一次,但可以被多次声明。
关键概念:静态类型—
C++是一种静态类型语言,其含义是在编译阶段检查类型。其中,检查类型的过程称为类型检查。在C++语音中,编译器负责检查数据类型是否支持要执行的运算,若不支持将会报错,并不会生成可执行文件。程序越复杂,静态类型检查越有助于发现问题。然而前提是编译器必须知道每一个实体对象的类型,这就要求我们在使用某个变量之前必须声明其类型。
标识符:C++的标识符由字母、下划线和数字组成,其中数字不能作为开头。长度没限制,对字母大小写敏感。用户自定义的标识符中不能连续出现两个下划线,也不能以下划线紧连大写字母开头,此外定义在函数体外的标识符不能以下划线开头。
作用域:建议当你第一次使用变量时再定义它。
复合类型:
复合类型:基于其他类型定义的变量,一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成,每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型。
引用:引用并非对象,相反的它只是为一个已经存在的对象所起的另外一个名字。因为引用本身不是一个对象,所以不能定义引用的引用。一旦定义了引用,就无法令其在绑定到另外的对象,而指针可以改变指向对象。
在新标准下,现在的C++程序员最好使用nullptr,同时尽量避免使用NULL来初始化指针。nullptr是一个特殊的字面值,而NULL是一个预处理变量。
const限定符:
因为const对象一旦创建后其值就不再改变,所以必须初始化。
默认情况下const对象仅在文件内有效,当多个文件中出现了同名的const对象时,其实等同于在多个文件中分别定义了独立的变量。可以用extern来使其在多个文件中共享(定义和声明都加上)。
C++将将引用绑定到非常量的临时量上的行为归为非法(因为此行为没有什么必要)。
顶层const表示指针本身是个常量,底层const表示指针所指的对象是一个常量。更一般的,顶层const可以表示任意的对象是常量,这一点对任何数据都适用,底层const则与指针和引用等复合类型的基本类型部分有关。
当执行对象的拷贝操作是常量是顶层还是底层区别明显。其中顶层const不受什么影响,当执行对下像的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说,非常量可以转换成常量,反之则不行。如果将一个底层const的指针赋给一个非底层const的指针,则此指针可修改所指对象的值,因此,底层const有限制作用。
允许将变量声明为constexpr类型以便有编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。constexpr声明指针时,只能声明有固定地址的对象,而函数体内部定义的变量一般没有固定的地址,定义在所有函数体外的变量具有固定地址,也可以在函数体内定义具有固定地址的变量(方法暂不知),并且constexpr声明指针时只对指针变量有作用,即使其具有顶层const性质。
处理类型:
类型别名:typedef关键字,别名声明using,类型别名和类型的名字等价。
auto类型说明符:让编译器替我们去分析表达式所属的类型,显然auto定义的变量必须有初始值。
编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。auto一般会忽略顶层const,同时底层const则会保留下来,如果希望推断出的auto类型是一个顶层const,则需明确指出:const auto f = ci;
第二种类型说明符decltype,它的作用是选择并返回操作数的数据结构(包括顶层const和引用在内)。切记:decltype((variable))(注意是双层括号)的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用。
自定义数据结构:
记住在类定义的最后加上“;”分号。
预处理:预处理变量无视C++中关于作用域的规则;
头文件及时(目前还)没有被包含在任何其他头文件中,也应该设置保护符,养成习惯。