2018年5月

函数原型:

为什么需要:
可以让编译器对不同的C++程序进行独立编译。
编译器正确处理函数返回值。
编译器检查使用的参数数目是否正确。
编译器检查使用的参数类型是否正确,如果不正确则尝试转换。
提高编译效率。

函数的参数
接收传递值得变量称为形参
传递给函数的值称为实参

在参数中 int *arr 和 int arr[] 代表的含义是一样的
其中像函数传数组 如果在函数中对数组进行更改原数组的内容 也会改变 因为传过来的是指向数组的指针

为防止函数无意间对指针进行修改 可以用const关键字

C++禁止将const的地址 赋值给非const得指针

尽可能使用const
这样可以避免由于无意间修改数据而导致的编译错误;
使用const使得函数能够处理const和非const实参,否则将只能接受非const数据。
如果条件允许,则应将指针形参声明为指向const的指针。

int age = 39;
const int *pt = &age; //不允许用pt修改age的值但是允许更改pt指向的变量
int *const finger =&age; //不允许用finger修改age的值也不允许更改pt指向的变量

int data3 = {{1,2,3,4},{9,8,7,6},{2,4,6,8}};
如果要将data这个二维数组传给函数则使用以下定义
int sum(int(*ar2)[4],int size);
int sum(int ar2[][4],int size);
两种意义完全一样但是第二种可读性更好。
ar2r = ((ar2+r)+c); //先取第一个下标的数组 然后再取第一个元素的值。

副作用:
在计算表达式时对某些东西,进行了修改。

顺序点:
程序执行过程中的一个点。

++n;
对n增加然后返回n

n++;
复制n一份副本 然后n++ 返回n副本

所以++n效率比n++高

*pt++;
先执行pt++ 再取值 因为后缀++优先级比*高

如果局部作用域里面跟局部作用域外的变量名字冲突了 则在局部作用域里面优先使用局部作用域里面的变量

cata = 17,240; // 17
cata = (17,240); // =240
逗号优先级最低 括号优先级最高 逗号表达式的值为最后一个逗号的表达式的值

ctime 包含了CLOCKS_PER_SEC 单位时间 还定义了clock_t的变量类型

类型别名:

define BYTE char

typedef char byte;

第二种比第一种好 如果是这种情况:

define FLOAT_POINTER float *

FLOAT_POINTER pa,pb;
则经过编译器会变成如下:
float * pa,pb; //pa是浮点指针变量 而pb不是

C++11 新for循环(范围)

double prices[5] = {4.99,10.99,6.87,7.99,8.49};
for (double x: prices)
{
 cout << x << std::endl;
}

但是这种循环 更改x不会影响原来的数组 要更改原来的数组则要这样子

for(double &x: prices)
{
 x= x*0.80;
}

也可以:

for(int x: {3,5,2,8,6})
{
 cout << x << " ";
}
cout << '\n'; 

strlen 不包含空字符/0

C++11字符串初始化: char first_date[] = {"Le Chapon Dodu"};

C++11 结构初始化:
struct inflatable{char name[20]; float volume;double price;}
inflatable duck{"Daphne",0.12,9.98}

C++11 结构初始化数组:
inflatable guests[2] =
{
{"Bambi",0.5,21.99},
{"Godzilla",2000,565.99}
}

结构体位字段
struct torgle_register
{
unsigned int SN :4; //用4位
unsigned int : 4; //空4位
bool goodIn:1; //有效输入1字节
bool goodTorgle:1;//成功输入
}

共用体
能够存储不同的数据类型 但是只能存储一种
union one4all
{
int int_val;
long long_val;
double double_val;
}

one4all pail;
pail.int_val = 15;
pail.double_val = 1.38; // int_val lost

int *pt;
pt = (int *)0xB8000000; //这样子是pt指向这个地址

采用new 分配内存
int *pt = new int; //new type 会分配一个type类型的地址给pt

使用delete释放内存
delte pt;

动态创建数组
int *pSome = new int[10];
delete [] psome;

int size;
cin >> size;
int *pz = new int[size];
delete [] pz;
注意:
delete 不能释放不是new的内存
不能多次使用delete同一个内存块
如果是用new[]分配的对应用delete[]

分配内存的方式:
自动存储(局部变量等 遵循LIFO 后进先出(堆栈形式存储))、静态存储(静态变量)、动态存储(new delete)、线程存储(C++11)

数组替代品:模板类:vector(C++98 STL) array(C++11 STL)
vector:
vector<double> a2(4);

array:
array<double,4> a3 = {3.14,2.72,1.62,1.41};

数组运用方法:
a1[-2] = 20;
是在a1的数组头地址在往前移动2位 c++不会检查这种数组超界
为了避免这种 可以用 vector 或者 array 里面的at方法 它会检测边界

a2.at(1) = 2.3;

climits 定义了各个系统的变量限制

初始化方式:
C++11:{}方式 如:int hamburgers = {24} int x = {} //x=0

各个系统的变量类型范围不一定一致 得看编译器的实现

wcha_t: 16字节的char 用来显示拓展字符集的变量类型

c++11 新增的类型:char16_t 和 char32_t

C++ 类型转换 如: (int)a 或者 int(a) 安全类型转换:static_cast<long> (thorn) //returns a type long conversion of thorn

美国标准局(ANSI) 制定C++标准
国际标准化组织(ISO) 加入了这个行列
创建联合组织ANSI/ISO

第一个标准 C++98 (ISO/IEC 14882:1998) 添加了异常、运行阶段类型识别(RTTI)、STL、模板
第二个标准 C++03 (ISO/IEC 14882:2003) 修复BUG
第三个标准 C++11 (ISO/IEC 14882:2011) 增加很多功能