C++语法基础
1、c++中提供了布尔型数,false表示假,true表示真。
2、输入输出流
输入:cin
cin>>x:从输入流中提取一个数存入变量x
cin的常用的api:
-
cin.get():读取一个字符,并返回读取的字符(空格和换行也算一个有效字符)
-
cin.peek():查看下一个字符,但并不读取(空格和换行也算一个有效字符)
-
cin.ignore(n):忽略输入流中的n个字符
-
cin.read(char*str,streamsize count ):从输入流中读取指定个数的字符,第一个参数是一个字符型的指针用于指向一个字符型数组,stramsize是一种有符号整型(具体与int的不同可以去csdn上查),count表示读取字符的数量
-
cin.putback(char c):用于将一个字符c重新放入到输入流中,以便再次读取。
输出:cout
cout<<x:输出变量x
cout的常用api:
-
cout.put(char c):输出字符
-
cout.write(char*s,streamsize n ):输出指定数量n的字符,输出的字符为s中的字符,s需要以null结尾
-
cout.width(int width):用于设置输出字段的宽度的方法,如果输出的宽度小于指定的宽度,会默认用空格进行填充(填充在其左侧)以达到设置的宽度,也可以通过cout.fill来设置填充的字符。
-
cout.fill(char x):设置填充字符
格式输出控制符:
首先输出格式控制符在iomanip的头文件内
std::setw(int n) | 设置字符宽度为n |
---|---|
std::left | 左对齐 |
std::right | 右对齐 |
std::internal | 内部对齐 |
std::dec | 使用十进制 |
std::hex | 使用十六进制 |
std::oct | 使用八进制 |
std::(no)showbase | (不)显示符号或前缀 |
std::(no)showpoint | (不)显示小数点后的0 |
std::(no)showpos | (no)显示正号 |
std::fixed | 固定精度 |
std::scientific | 科学计数法 |
std::setprecision(int n) | 设置浮点数精度为n,保留小数点后几位 |
std::setfill(char x) | 设置填充字符为c |
std::defaultfloat | 将浮点数的输出格式恢复为默认格式(取消先前设置的任何输出格式) |
左右对齐一般与setw一同使用(当输出的字符数量大于设定的值时便不会有效了)
-
左对齐(std::left):左对齐是指文本在指定的字段宽度内向左对齐。如果文本长度小于字段宽度,则在文本右侧填充空格以达到指定宽度。
-
右对齐(std::right):右对齐是指文本在指定的字段宽度内向右对齐。如果文本长度小于字段宽度,则在文本左侧填充空格以达到指定宽度。
-
内部对齐(std::internal):内部对齐是指文本在指定的字段宽度内进行对齐,但是对齐的方式与左对齐和右对齐有所不同。对于正数,内部对齐的行为与右对齐相同,即在左侧填充空格。而对于负数,内部对齐的行为与左对齐相同,即在右侧填充空格。这样可以使得负数的符号位与数字部分对齐,从而使整体看起来更加美观。
fixed控制格式输出,固定其为小数的模式进行输出
一般情况下,设置的输出控制格式的作用范围为永久性有效,直至相同的控制符进行重新设置或者程序结束
但有部分是临时性设置,如fixed和scientific等,只在其所在的输出语句有效。
八进制通常以0开头
十进制是默认显示样式,前面没有前缀
十六进制前缀为0x
效果展示:
判断下面两行代码的不同?
cout << setprecision(3) << y << endl;
cout << fixed << setprecision(3) << y << endl;
-
cout << std::setprecision(3) << y << endl;
:-
这条语句设置了浮点数的小数点后精度为3位,但没有指定输出格式。
-
结果会根据浮点数的大小来决定是否采用科学计数法。
-
-
cout << std::fixed << std::setprecision(3) << y << endl;
:-
这条语句设置了浮点数的小数点后精度为3位,并且使用了
std::fixed
控制符,指定了固定小数点表示法。 -
结果将始终以固定小数点表示法显示,小数点后有3位数字,不会采用科学计数法。
-
综上:保留几位小数的做法: cout<<fixed<<setpresion(n)
输入输出缓冲区:
标准输入流(键盘输入)和标准输出流(屏幕输出)。
输入缓冲区 : 当向 输入流 写入数据时 , 数据首先被写入 输入缓冲区 , 而不是直接写入到程序中 ; 当 输入缓冲区 写满时 , 数据会一次性写入磁盘 ;
输出缓冲区 : 当 程序 向 文件 写出 数据时 , 数据首先被 写出到 输出缓冲区 , 这种缓冲机制可以减少磁盘 I/O 操作的次数 , 从而提高程序的性能 ;
命名空间
避免名字重复,见前缀可以解决重名问题
内存分配与内存回收
new 创建空间
格式:
//申请空间
int* ptr = new int;
2、类型指针 指针变量名 = new 类型(初始值)
Eg.
//申请空间并初始化
int* ptr2 = new int(1);
3、类型指针 指针变量名 = new 类型[元素个数]
Eg.
//申请连续的空间,空间大小为4*10=40*
int* arr = new int[10];
delete 释放new创建的空间
//释放单个空间
delete ptr;
delete ptr2;
2、delete[] 指针变量名
Eg.
//释放连续的多个空间
delete[] arr;
也可以利用其创建一个二维数组,二维数组可以理解为指针的指针
指针指向了一群一维数组
指针的指针则指向了所有的指针,存放了所有一位数组的起始位置
eg:生成一个nxn的二维数组
int **str=new int*[n]; for(i=0;i<n;i++) { str[i]=new int[n]; }
引用
引用与指针类似,但引用不可以进行++,--
引用类似于起别名,在函数调用中,可以在函数中更改引用对象的值,但一个引用只可以作为一个变量的别名
引用代表给一个变量起别名,必须在定义时初始化,不能在定义完成后再赋值。(就是在引用定义时就必须交代清楚其的引用对象是谁)
内联函数
主要目的:提高函数的执行效率,使用inline定义函数即可将函数指定为内联函数,内联函数在编译时直接将函数体插入函数调用的地方,省去了普通函数调用时压栈、跳转和返回的开销。
inline 返回值类型 函数名(参数)
{
函数体;
}
函数重载
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题
参数列表不同:函数的参数列表必须不同,至少有一个方面不同,包括参数的类型、数量或顺序。返回类型不是函数重载的条件。
异常
在 C++ 中,try
是异常处理机制的一部分。异常处理允许程序在运行时发生错误时,优雅地处理这些错误而不是直接崩溃。
try
块用于包含可能会抛出异常的代码片段。它的基本语法如下:
try { // 可能会抛出异常的代码片段 } catch (ExceptionType1 ex1) { // 处理 ExceptionType1 类型的异常 } catch (ExceptionType2 ex2) { // 处理 ExceptionType2 类型的异常 } catch (...) { // 处理其他类型的异常 }
-
try
块中包含的代码可能会抛出异常。 -
catch
块用于捕获并处理try
块中抛出的异常。 -
catch
块后面可以跟一个括号,其中包含异常类型的名称,用于指定要捕获的异常类型。如果不需要访问异常对象,也可以省略异常类型。 -
可以有多个
catch
块,每个catch
块处理不同类型的异常。 -
如果没有适合的
catch
块来处理抛出的异常,异常将会继续传播到调用栈的上一层。