一、C++基本框架
cpp
#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 对外输出,相当于C语言中的printf。
<< 后面跟要输出的信息。
endl 输出一个换行符,相当于C语言中的\n。
C++注释:基本同C语言,有以下两种
cpp
单行注释://注释内容
多行注释:/*
*注释内容
*
*/
二、cout打印输出
1.单份输出
cpp
cout << "Hello" <<endl;
cout << 10 << endl;
2.多份输出
cpp
//格式:cout << ... << ... << endl;
cout << "I am" << 10 << "years old\n";
3.格式化输出
cpp
#include <iomanip>
cout << setw(20) << "A";
//设置A第一个输出从20列开始
cout << setfill('*') << setw(20) << endl;
//设置填充字符为*,同时setw设置这个填充字符到19位
setiosflags可以用于设置多种格式标志,例如:
- ios::fixed: 使用定点格式输出浮点数。
- ios::scientific: 使用科学计数法输出浮点数。
- ios::showpoint: 始终显示小数点,即使在整数时也显示。
- ios::uppercase: 在科学计数法中使用大写字母(例如,E而不是e)。
setprecision可以用于设置浮点数的有效数字或小数位数,具体取决于流的格式标志(如ios::fixed或ios::scientific)的设置。
- 默认情况下,setprecision设置的是有效数字的数量。
- 当与ios::fixed一起使用时,setprecision设置的是小数点后的位数。
- 当与ios::scientific一起使用时,setprecision同样设置小数点后的位数。
当使用以上两个控制符时,不仅设定了保留几个小数还确定了小数点对齐(即小数位数对齐)
三、常量
同C语言。
cpp
20;//数字
180.6;//小数
'c'//字符
"ABC"//字符串
#define FAT_BMI 28 //符号常量,define+标识符+常量,后续使用标识符即使用这个常量
C++中常量后面是可以有后缀的。
cpp
10L; //指定long类型
123UL; //指定为unsigned long类型
四、变量
同c语言,变量存储数据。
cpp
int num; //变量类型+变量名
num = 10; //变量赋值
//同 int num = 10;
常见变量类型:
1.int 整型2.float 实型(浮点数) 3.char 字符型4.string 字符串型
五、无符号和有符号数字
六、实型
注意:实型数据没有signed和unsigned之分,所以都是有正负的。
七、char类型
char类型用来表示字符,同时支持有符号和无符号。
八、转义字符
九、字符串
与C稍有区别。但也可以使用C语言风格
cpp
string c = "c++";
char s[] = "c";
字符串的拼接
使用+将不同的字符串拼接。
cpp
string major = "物理";
string class_name = "一班";
string name = "LZY";
string all = "我的专业是" + major + ",我来自" + class_name + "我叫" + name;
注意:+仅支持 用于++字符串和字符串++ 的拼接,对于连接非字符串,需将字符串转换为字符串,可以使用内置函数**to_string()**转换成字符串。
cpp
string name = "小李";
int height = 185;
string sen = name + "的身高为" + to_string(height) + "cm。";
十、布尔型
布尔数据类型用以表达互斥。
cpp
bool flag = true;
十一、cin数据输入
基本结构:数据类型 变量
cin >> 变量; 这一行代码执行的是用户输入数据给变量,相当于C语言中的scanf("%d",&n);
cpp
int num;
cin >> num;
十二、算术运算符
十三、赋值运算符
十四、比较运算符
用于对两个数据进行比较(大,小,相等),得到bool类型结果。
C语言字符串比较可以使用strcmp函数。
cpp
#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类型就可以用比较运算符。
cpp
string s3 = "a";
char s4[] = "a";
cout << "s3是否等于s4" << (s3 == s4) << endl;
//注意,这里在输出里面比较最好使用()区分开
十五、逻辑运算符
用于对单个或多个表达式进行逻辑判断。
十六、三元运算符
语法:
产出bool结果的表达式 ?值1 :值2;
如果?之前的表达式结果为true,则结果是值1,若结果为false则是值2。
cpp
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";
else
value = "b";
十七、switch语句
cpp
switch(expression)
{
case expression_1: //expression_1是我们给expression设置的其中一个值
code;
break;
default;//以上几种情况都不满足就执行这一句跳出switch
}
十八、枚举类型
枚举:本质上是一个被命名的整形常数的集合。
枚举一般用于将一些数字或字符串符号化。
cpp
/*enum 枚举名{
枚举元素1,
枚举元素2,
......
};*/
//枚举里面的元素第一个对应数字0,依次递增,可以通过访问数字达到访问枚举里面的元素
enum Season{
SPRING, //0
SUMMER, //1
AUTUMN, //2
WINTER //3
}; //元素和对应数字是等价的
//判断的时候用SPRING判断其实就是与0判断
实例代码:
enum Season{
SPRING, //0
SUMMER, //1
AUTUMN, //2
WINTER //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的区别
continue:使得这一次循环提前结束,进入下一次循环。
break:使得循环直接结束,跳出循环。
二十、goto语句
语法:
cpp
label1:
...;
goto label1;
实际案例:
cpp
int main()
{
int i = 1;
loop:
cout << i << " ";
i++;
if(i<=10)
goto loop;
cout << endl;
return 0;
}
二十一、数组的遍历
cpp
int arr[] = {1,2,3,4,5};
for(int i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{ //这里的sizeof是用来求数组的元素个数的
cout << arr[i] << endl;
}
二十三、多维数组
二维数组:
cpp
int v[2][2] = {{2,2},{3,3},{4,4},{5,5}};
//一层2*2的二维数组
三维数组:
cpp
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的而维数组
数组遍历:
cpp
//二维
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申请内存。
cpp
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;
二十六、数组元素的移除
cpp
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];
else
newnum[i]=num[i];
}
for(int p = 0;p<4;p++)
{
cout << newnum[p] << endl;
}
二十七、函数的重载
可以对一个函数名进行不同定义,使用这个函数时会自动对输入的形参类型以及数量来判断使用哪一个。
cpp
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),即指针此时指向一个为止的地址,这是很危险的,因为你不知道这个地址上有什么。
注意:
1.不要轻易进行指针之间的赋值。
2.delete回收空间前,确保这个空间100%不被使用。
二十九、结构体
用户自定义复合数据类型,可以包括不同的数据类型。
cpp
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)结构体数组
cpp
//结构体数组,这个数组里面的一个元素是一个结构体
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)结构体指针
cpp
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)结构体数组指针
cpp
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;
//这种使用动态内存空间,减少内存占用