C++定义常量的两种方式:
- #define 宏常量 值(不可以修改)
- 限定符:const 数据类型 常量名 = 常量值(表示不可修改)
- const比#define好:1.它能够明确指定类型。2.可以使用c++的作用域规则将定义限制在特定的函数或文件中。3.const可用于更复杂的类型。4.在c++中可以声明数组的长度。
常识
- c++编程风格:main()放在最前面,使用自定义函数时先声明,即函数原型。
- 标识符的第一个字符只能是字母或下划线
- namespace是指标识符的各种可见范围,作用:定义标示符using namespace std,写c++代码时一般都要加上。
- 上面using编译指令使得std名称空间中的所有名称都可用,在大型项目中是个问题,更好的办法是只使所需的名称即可,这样可以通过using声明来实现:using std ::cout; using std :: cin;。
- c++中默认最多显示6位有效数字
- 3e2 = 3*10^2
- 3e-2 = 3*0.1^2
- x.xxxE+n:小数点向右移动n位:x.xxxE-n:小数点向左移动n位。
- 做除法时:有一个数为浮点值时,结果为浮点值,否则为整数。除法有3种运算符:int 除法,float除法,double除法。使用相同的符号进行多种操作叫:运算符重载。
- 字符型变量将对应的ASCII码放到存储单元
- 水平制表符:\t:表前面的内容占8个字符,可以整齐的输出字符
- 字符串:1.类似c语言,2.string a = “…”; (#include < string >)
- 三目运算符:表达式1?表达式2:表达式3;
- 水仙花数 = 每位数字^3的和
- system(“pause”);暂停黑窗口
- c++中可以直接使用 “+” 进行字符串的拼接
- 清屏操作:system(“pause”)按任意键继续…; system(“cls”);清屏
- c中字符串比较用strcmp(); 相同返回0,错误比较:temp = “xxxx”; 两者比较的是地址,而不是字符串。
- 使用string类型的字符串可以直接比较。
- c风格的字符串:char *类型,当参数传递时,实际上传递的是字符串的第一个字符的地址
- 处理字符串错误的标准方式:当str == '\0’时,*str = 0;
while (*str)
{
.......;
str++;
}
- 重定向运算符:<
- 输出时(cout<<):<<运算符将字符串插入到输出流中
- 输入时(cin>>):>>运算符从输入流中抽取字样
-
>>和<<:表示信息流动的方向。
- auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。
- 关键字typedef创建数据类型的别名
cin/cout
-
输出:cout<<…<<endl;,cout<<“…\n”;类似于字符串的拼接(要拼接的字符串之间使用空格或‘+’)。成员函数:cout.put(); 通过类对象来使用函数put()。
-
输入:cin>>变量名; 缺点:不能读取空格。循环读取时读取空格后面的内容。
-
读取一行字符串:
-
1.cin.getline(数组名称,大小); 它通过换行符来确定末尾,将换行符替换为‘\0’,并且丢弃换行符。
-
输入到string对象中:getline(cin,string str);
-
2.cin.get(数组名称,大小).get(),能够读取多行。如果读取一个字符:cin.get(); 读取字符串:cin.get(数组名称,大小),它不抛弃换行符。
-
3.如果多次使用cin.get(name,size);进行输入时,要使用cin.get();进行处理换行符(为下一行输入做准备),如果不这样做,则下一行无法输入。
-
可以使用cin的返回值判断输入类型是否正确。如果输入错误,则删除错误输入:cin.clear();
-
cin用于输出字符串时,遇到空白(空格、制表符、换行符)时结束。如果空白后面还有内容,并且往下面还有cin时,则留给下一次输入,没有则本次输入cin结束。
-
cin.ignore(n); 忽略输入行的前n个字符
-
cin.putback(ch); 放回缓冲区
数组
- c++11数组的初始化:可以省略“=”,:float a[6] {…};
- 数组:放在一块连续的内存空间中
- 数组首地址:array = &(array[0]); 数组名取地址:&array表示整个数组的地址。例子:int (*temp) [n] = &array; 即:(*temp) [0] = array[0]; 即:*temp与array等价。
- 在数组中有这样的关系:array[n] = *(array+n);将指针或数组名+1,实际上加了一个与指针指向的类型的长度相等的值
- array[3] = *(array+3)(右边转化为指针数组操作)
- 计算数组中的元素:sizeof(array) / sizeof(array[0]);
- c++中二维数组实际上是一维数组中每个元素作为数组组成。
- array[m] [n] = * ( * (array + m) + n)
- 二维数组行数:sizeof(array) / sizeof(array[0]);
- 二维数组列数:sizeof(array [0]) / sizeof(array [0] [0]);
- 二维数组的数组名为第一行的首地址或第一个元素的首地址:array = array[0] = &array[0] [0];
- 数组指针:针对二维数组,变化时一行一行的跳。格式:数据类型 (*指针变量名)[]
int data[3][4] = {{1,2,3,4}, {9,8,7,6}, {2,4,6,8}};
int total = sum(data, 3);
以下为**函数原型**:
1.方式1:因为第一个元素本身是数组,所以data类型是指向由4个由int组成的数组的指针。其中列数已经指定,所以size为行数。
int sum(int (*ar2)[4], int size);
2.方式2
int sum(int ar2[][4], int size);
- 字符数组和字符串数组区别:字符数组末尾无‘\0’,而字符串数组末尾有’\0’。
- 数组替代品
1.模板类vector(功能强大,效率低):是一种动态数组,自动使用new和delete,类似于string类。vector<数据类型> vt(元素个数n);创建名字为vt的数组,包含n个数据类型的数组。
2.模板类array:长度固定,使用栈(静态内存分配),效率与数组相同,更方便,安全。array<数据类型,元素个数>数组名;元素个数为常量,不能是变量。
3.使用vector和array的成员函数at(),在运行期间捕捉非法索引,但是运行时间长。 - 确定字符串中的字符数:1.strlen(),2.str.size();表明:str是一个string对象,而size()是一个类方法。
- 定义指针:int *p; 解引用:取指向内存中的数据:*p即可
- 32位操作系统下(x86)指针占用空间4字节,64位操作系统(x64)为8字节
- 空指针的地址编号为0,不可以解引用和访问(0~255的内存编号是系统占用的,不可以访问),它用于初始化指针变量。
- 野指针:int *p = (int *)0x0111; 即:空指针和野指针都不能访问
- 常量指针:const int *p = &a,p指针指向的内容不可以改,但是指向的地址可以修改。要修改内容用age = xxx;即可。
const float g_earth = 9.80;
const float * pe = &g_earth; // VALID
const float g_moon = 1.63;
float * pm = &g_moon; // INVALID
- 指针常量:int * const p; p指针指向的内容可以改,但是指向的地址不可以修改。
- const int * const p:两者都不可以改
- 数组传入函数中时,直接传入数组名称即可
- 在函数头或函数原型中传入数组:int *array等价于 int array [],但其他地方不等价。
结构体,共用体
- 先定义结构体struct phone{…};,再到main函数中定义结构体数组struct phone vivo[n] = {…};函数中
- 如果将结构体的值直接传入函数中,此时会复制一份结构体的内容,如果采用地址传递参数,则不会发生复制,可以减少内存空间。
- 结构体中使用const时,不能对其进行操作。
- 共用体与结构体形式类似,但共用体中只能存放同一种数据类型,名称只能存储一个值。用于节省内存。
- c中结构体只有变量,c++中结构体既有变量,又有函数。
逗号运算符
- 使用逗号运算符将两个表达式合并,顺序计算。
- for(int i = 0,int j = xxx.size()-1; i<j; ++i, --j)
{
…
}
基于范围的for循环
for(数据类型 i :数组名)
{
…
}//遍历循环数组中的元素
文件尾条件
- 如果输入来自文件,可以使用EOF检测文件尾,在Unix中按CTRL+D,在win下CTRL+Z或enter
- 检测到EOF时,cin将eofbit和failbit置为1,即通过成员函数eof(),和fail()查看,在现实中使用cin.fail() == true / false来判断,使用cin.clear()清除EOF标记,使输入继续进行。
- 例子:循环读取:while(!cin.fail()){…} ===>> while(cin){…} ====> while(cin.get(ch)){…},因为cin.get(char)方法的返回值是cin对象,通过返回转换为true / false 来判断是否到底EOF。而无参数的cin.get()成员函数返回输入中的下一个字符,通过返回EOF的值来判断到达EOF。类似于c语言中的getchar()。使用cout.put(ch);显示字符,;类似于c语言中的putchar()。
字符函数库cctype
枚举
- enum用法与struct相似
- 例子:enum temp = {xxx,yyy,zzz,ccc,vvv,…};
- temp为枚举类型名,即声明变量:temp temp1;
- 将xxx,yyy,zzz,作为符号常量,他们对应整数值:0~n,这些符号常量叫做枚举量。
- 没有算术运算,只有赋值运算。
- 枚举量可以用作标签,while与switch语句中,将枚举量自动变换为int