一、C++基本框架
#include "iostream"using namespace std; //命名空间//预处理指令,必须要包含//另一种方式#include <iostream.h>,这样在主函数中必须要使用“std::”int main(){cout << "Hello,World!" << endl;//同cout << "Hello World!\n";//C语言中为printf("Hello,World!");return 0;}
单行注释://注释内容多行注释:/**注释内容**/
二、cout打印输出
1.单份输出
cout << "Hello" <<endl;cout << 10 << endl;
2.多份输出
//格式:cout << ... << ... << endl;cout << "I am" << 10 << "years old\n";
3.格式化输出
#include <iomanip>cout << setw(20) << "A";//设置A第一个输出从20列开始cout << setfill('*') << setw(20) << endl;//设置填充字符为*,同时setw设置这个填充字符到19位
- ios::fixed: 使用定点格式输出浮点数。
- ios::scientific: 使用科学计数法输出浮点数。
- ios::showpoint: 始终显示小数点,即使在整数时也显示。
- ios::uppercase: 在科学计数法中使用大写字母(例如,E而不是e)。
setprecision可以用于设置浮点数的有效数字或小数位数,具体取决于流的格式标志(如ios::fixed或ios::scientific)的设置。
- 默认情况下,setprecision设置的是有效数字的数量。
- 当与ios::fixed一起使用时,setprecision设置的是小数点后的位数。
- 当与ios::scientific一起使用时,setprecision同样设置小数点后的位数。
当使用以上两个控制符时,不仅设定了保留几个小数还确定了小数点对齐(即小数位数对齐)
三、常量
20;//数字180.6;//小数'c'//字符"ABC"//字符串#define FAT_BMI 28 //符号常量,define+标识符+常量,后续使用标识符即使用这个常量
10L; //指定long类型123UL; //指定为unsigned long类型
四、变量
int num; //变量类型+变量名num = 10; //变量赋值//同 int num = 10;
1.int 整型2.float 实型(浮点数) 3.char 字符型4.string 字符串型
五、无符号和有符号数字
六、实型
注意:实型数据没有signed和unsigned之分,所以都是有正负的。
七、char类型
八、转义字符
九、字符串
string c = "c++";char s[] = "c";
字符串的拼接
string major = "物理";string class_name = "一班";string name = "LZY";string all = "我的专业是" + major + ",我来自" + class_name + "我叫" + name;
注意:+仅支持用于字符串和字符串的拼接,对于连接非字符串,需将字符串转换为字符串,可以使用内置函数to_string()转换成字符串。
string name = "小李";int height = 185;string sen = name + "的身高为" + to_string(height) + "cm。";
十、布尔型
bool flag = true;
十一、cin数据输入
cin >> 变量; 这一行代码执行的是用户输入数据给变量,相当于C语言中的scanf("%d",&n);
int num;cin >> num;
十二、算术运算符
十三、赋值运算符
十四、比较运算符
用于对两个数据进行比较(大,小,相等),得到bool类型结果。
#include "cstring"char s1[]="hello";char *s2="hello";int rusult = strcmp(s1,s2);//结果有三种 -1(s1<s2)、0(s1=s2)、1(s1>s2)cout << result << endl;
C++中字符串比较,只要两个字符串中有一个是string类型就可以用比较运算符。
string s3 = "a";char s4[] = "a";cout << "s3是否等于s4" << (s3 == s4) << endl;//注意,这里在输出里面比较最好使用()区分开
十五、逻辑运算符
十六、三元运算符
如果?之前的表达式结果为true,则结果是值1,若结果为false则是值2。
int num1,num2;cin >> num1;cin >> num2;string value = num1 > num2 ? "a" : "b"cout << value << endl;//若num1>num2,则value=a,否则等于b//C语言风格if (num1 > num2)value = "a";elsevalue = "b";
十七、switch语句
switch(expression){case expression_1: //expression_1是我们给expression设置的其中一个值code;break;default;//以上几种情况都不满足就执行这一句跳出switch}
十八、枚举类型
/*enum 枚举名{枚举元素1,枚举元素2,......};*///枚举里面的元素第一个对应数字0,依次递增,可以通过访问数字达到访问枚举里面的元素enum Season{SPRING, //0SUMMER, //1AUTUMN, //2WINTER //3}; //元素和对应数字是等价的//判断的时候用SPRING判断其实就是与0判断实例代码:enum Season{SPRING, //0SUMMER, //1AUTUMN, //2WINTER //3};string season;cout << "你最喜欢的季节是:";cin >> season >> endl;switch(season){case SPRING:cout << "你最喜欢的季节是春天。" << endl;break;case SUMMER:cout << "你最喜欢的季节是夏天。" << endl;break;case AUTUMN:cout << "你最喜欢的季节是秋天。" << endl;break;case WINTER:cout << "你最喜欢的季节是冬天。" << endl;break; }
十九、循环中的continue和break的区别
二十、goto语句
label1:...;goto label1;
int main(){int i = 1;loop:cout << i << " ";i++;if(i<=10)goto loop;cout << endl;return 0;}
二十一、数组的遍历
int arr[] = {1,2,3,4,5};for(int i = 0;i<sizeof(arr)/sizeof(arr[0]);i++){ //这里的sizeof是用来求数组的元素个数的cout << arr[i] << endl;}
二十三、多维数组
int v[2][2] = {{2,2},{3,3},{4,4},{5,5}};//一层2*2的二维数组
int v[2][3][3]={{{1,2,3},{4,5,6},{7,8,9}},{{1,2,3},{4,5,6},{7,8,9}}};//有两层,每层是一个3*3的而维数组
//二维int v[2][2] = {{2,2},{3,3},{4,4},{5,5}};for(int i = 0;i<sizeof(v)/sizeof(v[0]);i++){for(int p = 0;p < sizeof(v[0])/sizeof(v[0][0]);p++){cout << v[i][p] << endl; }}//三维for(int m = 0;m < sizeof(v2)/sizeof(v2[0]);m++){for(int n = 0;n < sizeof(v2[0])/sizeof(v2[0][0]);n++){for(int j = 0;j < 3;j++){cout << v[m][n][j] << endl; } }}
二十四、指针
对于定义指针,我们需要在定义完后并给他赋值,这样指针就有确切的值,并不会并指向其它地方,否则可能会指向一个重要的地址,然后更改它的值导致重要数据被更改这样的问题。
指针的运算是针对内存地址进行运算,例如p++,就是对p指向的内存往后加对应的字节。
二十五、动态内存分配
new运算符分配内存,delete运算符释放new申请内存。
int *p = new int;//申请了一个int类型的空间,并把这个空间的地址赋给指针p//此时这个地址上还未赋初始值*p = 10;cout << *p << endl;delete p;//用delete,对象是指针int *n = new int[5];n[0]=1;*n=1;//两个等价n[1]=2;*(n+1)=2;//二者等价cout << p[0] << endl;cout << *(n+1) << endl;delete[] p;
二十六、数组元素的移除
int *num = new int[5] {1,2,3,4,5};int *newnum = new int[4];for(int i = 0;i < 5;i++){if(num[i]==2)continue;if(num[i]>=3)newnum[i-1]=num[i]; elsenewnum[i]=num[i];}for(int p = 0;p<4;p++){cout << newnum[p] << endl;}
二十七、函数的重载
可以对一个函数名进行不同定义,使用这个函数时会自动对输入的形参类型以及数量来判断使用哪一个。
int sum(int a,int b);double sum(double c,int d[]);long sum(double e[],int f,double g);//方便重载函数的模板template <typename T> //作用域只在这下面一行T sum(T A[],T B)
二十八、指针悬挂
指针指向的区域被回收(delete),即指针此时指向一个为止的地址,这是很危险的,因为你不知道这个地址上有什么。
二十九、结构体
struct student{string name;int age;string Class;};struct student stu = {.name:"aurora",.age:18,.class:"一"};cout << stu.name << endl;//默认值,有时候会给结构里面的元素提供一个默认值,这样后续就可以不给这些元素一个默认值//这样不给值的时候会默认提供默认值struct student{string name,int age,string class="一"};
1)结构体数组
//结构体数组,这个数组里面的一个元素是一个结构体struct student arr[2];arr[0]={.name:"周杰伦",/age:10,.class:"一"}arr[1]={.name:"林俊杰",/age:11,.class:"二"}cout << arr[0].name << endl;//定义加直接声明struct student arr[2]={[0]:{.name:"周杰伦",/age:10,.class:"一"},[1]:{.name:"林俊杰",/age:11,.class:"二"}};
2)结构体指针
struct student{string name,int age,string Class};struct student stu = {"小明",11,"一"};struct student *p = &stu;//以上使用方法使用的是静态内存空间,不可回收,下面使用动态内存空间struct student *p = new student {"小明",11,"一"};//这个可以使用delete删除cout << p->name << endl;cout << p->age << endl;cout << p->Class << endl;
3)结构体数组指针
struct student stu[] = {{"小明",11,"一"},{"小红",10,"一"}};struct student *p = stu;cout << p[0].name << endl;cout << p[1].name << endl;//以上使用的是静态内存空间struct student *p = new student[2]{{"小明",11,"一"},{"小红",10,"一"}};cout << p[0].name << endl;cout << p[1].name << endl;delete[] p;//这种使用动态内存空间,减少内存占用