C++Primer基础部分

extern:

声明变量。
如果只是想声明一个变量而非定义它,就在变量名前加关键字  extern 。

extern int i;//声明i而非定义i
extern语句如果包含 初始值就不再是声明了,而是变成了定义。

例如:extern double pi=3.14.16;//定义
区别:函数声明无需函数体,用一个分号替代即可。

复合类型:引用、指针

 复合类型是指基于其他类型定义的类型。
一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成
目前阶段所学,声明符就是变量名

引用:

为对象起了另外一个名字,在声明的变量名前加&符号
 引用必须先初始化
 引用类型的初始值必须是一个对象

错误示例:int &refVa14=10
引用的对象与声明的变量必须是同一个数据类型

指针:

* 指针是一个对象,可以给它赋值和拷贝
* 在生命周期内,可以先后指向几个不同的对象
* 无需在定义时赋初值,如果没有初始化,也将拥有一个不确定的值
* 如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问该对象

void*指针:

可以用于存放任意对象的地址。 面对一条比较复杂的指针或引用的声明语句时,从右向左阅读 有助于弄清楚他的真实含义。const限定符:
防止程序运行的过程中修改值 默认情况下,const 被设定只在文件内有效
如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。

constexpr变量:size_t

* 将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式
* 声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化

typedef关键字:

可以给类型起别名。
将复杂的类型简易化。

using:别名声明:

新标准规定的另一种起别名的方式

如:using SI=sales_item //SI是Sales_item的别名

auto类型说明符:

* auto定义的变量必须有初始值

decltype类型指示符:

* 选择并返回操作数的数据类型

直接初始化和拷贝初始化:

如果使用等号(=)初始化一个变量,实际上执行的就是拷贝初始化。
例:string s5=“hiya”;

反之,如果不是用等号(=),则直接初始化。
例:string s6(“hiya”);

toupper():

* C 标准库 - <ctype.h>
* C 库函数 int toupper(int c) 把小写字母转换为大写字母。
* 例子:

	* int toupper(int c);
	* c -- 这是要被转换为大写的字母。

定义和初始化内置数组:

  • 数组的维度说明了数组中元素的个数。

例如:a[d] a是数组的名字,d是数组的维度。
编译时维度应该是已知的的,所以维度必须是一个常量表达式。
当使用字符串字面值对此类数组进行初始化,一定要注意字符串字面值结尾处还有一个空字符。

不允许拷贝和赋值:

* 不允许使用一个数组初始化另一个数组

	* int 2[]={0,1,2};
	* int a2[]=a;     //错误
* 不能把一个数组直接赋值给另一个数组

	* a2=a;     //错误

注意:有些编译器支持数组的赋值,这就是所谓的编译器扩展,应当避免使用非标准特性。unsigned:
* unsigned的作用就是将数字类型无符号化。

指针和数组:

* 在很多用到数组名字的地方,编译器都会自动地将其替换为一个指向数组首元素的指针。

	* 例如:string *p2 = nums;   //等价于p2 = &nums[0]。
	* 在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。
* 

size_t类型:

* 是一种无符号类型,它被设计的足够大,以便能表示内存中任意对象的大小。
* 头文件是:
* C++:<cstddef>
* C      :   <stddef.h>

ptrdiff_t:带符号类型使用数组初始化vector对象:

* 不允许使用一个数组为另一个内置类型的数组赋初值,也不允许使用vector对象初始化数组。
* 但是,允许使用数组来初始化vector对象。只需将拷贝区域的首元素地址和尾后地址就可以了。

	* 例如:int int_arr[]={0,1,2,3,4,5};
	* //ivec有6个元素,分别是int_arr中对应元素的副本
	* vector<int> ivec(begin(int_arr), end(int_arr));

多维数组:

* 多维数组的实质是数组的数组
* 对于二维数组来说,长把第一个维度称作行,第二个维度称为列

prtdiff_t:

* 是一种带符号的整数类型,它的空间足够大, 能够表示数组中任意两个指针之间的距离。
* 头文件是:#include<cstddef>

理解算术转换:

* char型的字符常量,可以表示一个数字值,具体的数字值依赖于机器上的字符集,一般来说‘a’对应的是数字值是97。
* 例如:int ival = 3.14159L + 'a'; 1int 值转换成long double

函数类型三要素:

* 返回类型、函数名、形参类型

try语句块和异常处理:

典型异常处理:失去数据库连接、遇到意外输入
throw表达式:用于异常检测
try语句块: 用于异常处理

try语句块以关键字开始,并以一个或多个catch子句结束。
抛出的异常通常由catch子句处理,所以catch子句也被称作异常处理代码。
一套异常类:用于在throw表达式和相关的catch子句之间传递异常的知识。

函数重载:

如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数。
如:void print(const char *cp);
void print(const char beg,const int *end);
void print(const char ia[],size_t size);
不允许两个函数除了返回类型外其他所有元素都相同

例如:Record lookup(const Account&);
bool lookup(const Account&); //错误;与上一个函数相比只有返回类型不同
注意:不是所有情况都适用于函数重载,要看哪个更容易理解函数的意思。

引用返回值:

函数的返回类型决定函数调用是否是左值,调用一个返回引用的函数得到左值,其他返回类型得到右值。

NDEBUG预处理变量:

assert的行为依赖于一个名为NDEBUG的预处理变量的状态。

如果定义NDEBUG,则assert什么也不用做.

使用#define语句定义NDEBUG,关闭调试状态。

默认状态下没有定义NDEBUG,此时assert将执行运行时检查。

感兴趣欢迎加入QQ群,一起交流,也可以关注微信公众号:黑马金牌编程