入门“HELLO WORLD"编写
注释
- 行注释 //
- 块注释:/* */ (可注释多行 不能嵌套)
数据类型
- 关键字
- 整型变量(常量和变量)
-
常量:
整型、实型、字符型、字符串- 整型常量:
二进制:0b开头
十进制:正常数字
八进制:0开头
十六进制:0x开头 a=10
- 整型常量:
-
变量:变量名代表空间内容
定义形式: 类型名 变量名;
命名规则:字母数字下划线组成,不能由数字开头,不可是关键字,区分大小写
-
变量的初始化
- 在定义变量时给变量赋值
全局变量(函数外定义)不初始化内容为0
局部变量不初始化内容不确定
变量一般建议初始化为0
整型变量的使用
- 读(取值)写(赋值)
- 变量的声明(多文件编译使用):对变量名以及类型提前说明,不会为该变量开辟空间
先使用后定义(extern 修饰 外部可用)
- 变量的定义:创建变量名,系统为变量开辟空间
- 变量的声明:对变量的类型和名称事先说明,不会为变量创建空间(全局变量)
- 变量的使用:对已经存在的变量的读写操作
键盘给变量赋值
- 使用关键字cin给变量获取输入
int data = 0;
cin>>data;//data获取键盘输入
- 同时给多个变量获取键盘输入(每个变量的值以空格隔开或回车)
cin可以自动跳过空格和回车 右箭头
int data = 0;
int num = 0;
cout<<"请输入两个int数据:";
cin>>num>>data;
cout<<"num="<<num<<",data="<<data<<endl;
return 0;
例题:键盘获取输入求最大值
#include <iostream>
using namespace std;
int main()
{
int num1=0;
int num2 = 0;
cout<<"请输入两个int数据:";
cin>>num1>>num2;
if(num1 > num2)
{
cout<<"最大值为:"<<num1<<endl;
}
else
{
cout<<"最大值为:"<<num2<<endl;
}
return 0;
}
字符类型
字符常量:
用单引号括起来(单引号只能作用于一个字符,转义字符除外)
输出ASCII值的方式:
cout<<'a'<<endl;
cout<<(int)'a'<<endl;//输出ASCII值
字符变量
![在这里插入图片描述](https://img-blog.csdnimg.cn/c3e1feac1e2741c691ed6a3c497ef0b4.png)
字符变量的初始化
char ch = '\0';//'\0'的ASCII就是0
- ‘\0’ 和’0’、数值0 的区别
’ \0’: 字符常量(char)ASCII为0
数值0:是整型常量(int) 内存的存储值为0
‘0’: 字符常量(char)ASCII为48
键盘给字符变量赋值
char ch='\0';
cout<<"请输入一个字符:";
cin>>ch;
cout<<"ch="<<ch<<endl;
例题
大小写转换
需求:键盘输入一个字符,小写改成大写,大写改成小写,其他字符不转换
#include <iostream>
using namespace std;
int main()
{
char ch='\0';
cout<<"请输入一个字符:";
cin>>ch;
if(ch>='a' && ch<='z')
ch = ch-('a'-'A');
else if(ch>='A' && ch<='Z')
ch = ch+('a'-'A');
cout<<"ch="<<ch<<endl;
return 0;
}
字符常量和字符串常量的区别
实型(浮点数)
- 实型常量
不以f结尾的实型常量为double类型 eg:3.14
以f结尾的实型常量为float类型 eg:3.14f
指数形式:123e3(10的三次方) - 实型变量
有符号数和无符号数
有符号数
数据的二进制最高位为符号位,其它为数据位
最高位1表示负数,0表示正数
-128-- 127
无符号数
没有符号位 所有二进位都是数据位
0 – 255
进制的转换
进制的概述
十进制转其他进制![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/acbe058232a5732e96ab28443da3b151.png)
其他进制转十进制
其他进制转换
原码、反码、补码
对数据的存
对数据的取
其他关键字
转义字符
类型转换
- 转换的方法有两种:
运算符
算术运算符
- 例题
#include <iostream>
using namespace std;
int main()
{
int data = 0;
cout<<"请输入一个int数据:";
cin>>data;
if(data%3 == 0)
{
cout<<data<<"能被三整除"<<endl;
}
else
{
cout<<data<<"不能被三整除"<<endl;
}
return 0;
}
复合运算符
关系运算符
逻辑运算符![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/30ab9a43d2abfcea0d966874fb7a7d43.png)
产生随机数
#include <iostream>
#include <time.h> //time函数的头文件
using namespace std;
int main()
{
//设置随机数种子 time(NULL)获取当前时间
srand(time(NULL));
//产生随机数据的函数rand()
cout<<rand()<<endl;
return 0;
}
位运算(二进制位运算)![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/829ba021f5d5cc508b0db586fb117ce2.png)
三目运算符
int data1 = 10;
int data2 = 20;
//(data1>data2?data1:data2)结果等价于data2
(data1>data2?data1:data2) = 200;
cout<<"data1="<<data1<<endl; //10
cout<<"data2="<<data2<<endl; //200
运算符优先级
自增自减运算符
控制语句(选择控制、循环控制)
选择控制语句if
if语句的形式
- 例题: 判断data能被3整除
int data = 12;
if(data%3 == 0)
{
cout<<data<<"能被3整除"<<endl;
}
if…else…语句
- 键盘输入一个int数据求它对2的余数
int data = 0;
cin>>data;
if(data%2 == 0)
{
cout<<data<<"对2的余数为0"<<endl;
}
else
{
cout<<data<<"对2的余数为1"<<endl;
}
if…else if… else语句
选择控制语句switch
- 例题:键盘输入1~7的数值 判断是星期几
int data = 0;
cout<<"请输入1~7的数值:";
cin>>data;
if(data<1 || data>7)
{
cout<<"输入的是无效数值,请输入1~7的数值"<<endl;
}
switch(data)
{
case 1:
cout<<"星期一"<<endl;
break;
case 2:
cout<<"星期二"<<endl;
break;
case 3:
cout<<"星期三"<<endl;
break;
case 4:
cout<<"星期四"<<endl;
break;
case 5:
cout<<"星期五"<<endl;
break;
case 6:
cout<<"星期六"<<endl;
break;
case 7:
cout<<"星期日"<<endl;
break;
}
循环控制语句for
- 例题:for循环求1~100的和
int i = 0;
int sum ;
for(i=1,sum=0;i<=100;i++)
{
sum+=i;
}
cout<<"sum="<<sum<<endl;
for循环中的break,contiune
循环嵌套循环
- 例题:输出九九乘法表
int i = 0;
int j = 0;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
cout<<j<<'*'<<i<<'='<<j*i<<" ";
}
cout<<endl;
}
循环控制语句while
- 例题:while求1~100的和
int i = 0;
int sum = 0;
while(i<=100)
{
sum+=i;
i++;
}
cout<<sum<<endl;
while中的break,continue
数组
一维数值数组
一维数值数组的定义
int arr[5];
int n = sizeof(arr)/sizeof(arr[0]);
int i = 0;
for(i=0;i<n;i++)
{
cout<<arr[i]<<" ";//未初始化的局部数组元素内部不确定
}
cout<<endl;
一维数值数组的初始化
一维数值数组的元素操作
int arr[5]={0};
int n = sizeof(arr)/sizeof(arr[0]);
cout<<"请输入"<<n<<"个int数值:";
int i = 0;
for(i=0;i<n;i++)
{
cin>>arr[i];
}
for(i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
- 例题:键盘输入10个数,求这10个数的最大值和最小值
int arr[10]={0};
int n = sizeof(arr)/sizeof(arr[0]);
cout<<"请输入"<<n<<"个int数值:";
int i = 0;
for(i=0;i<n;i++)
{
cin>>arr[i];
}
int min=arr[0],max=arr[0];
for(i=1;i<n;i++)
{
max = max>arr[i]?max:arr[i];
min = min<arr[i]?min:arr[i];
}
cout<<"min="<<min<<" max="<<max<<endl;
二维数值数组
二维数值数组的初始化
二维数值数组的元素操作
- 二维数值数组获取键盘输入
int arr[3][4]={0};
int row = sizeof(arr)/sizeof(arr[0]);
int col = sizeof(arr[0])/sizeof(arr[0][0]);
int i=0,j=0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
cin>>arr[i][j];
}
}
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
一维字符数组
一维字符数组的初始化
字符数组的遍历
键盘获取字符串
- 例题:获取一个字符串,求该字符串的长度
char str[32]="";
cout<<"请输入一个字符串:";
cin.getline(str,sizeof(str));
int i=0;
while(str[i] != '\0')
i++;
cout<<str<<"的长度:"<<i<<endl;
二维字符数组
遍历二维字符数组
char arr[5][128]={"hello","world","hehehe","xixixi","lalala"};
int row = sizeof(arr)/sizeof(arr[0]);
int i;
for(i=0;i<row;i++)
cout<<arr[i]<<endl;
二维字符数组获取键盘输入(获取多个字符串)
char arr[5][32]={""};
int row = sizeof(arr)/sizeof(arr[0]);
int i;
for(i=0;i<row;i++)
{
cin>>arr[i];
}
for(i=0;i<row;i++)
{
cout<<arr[i]<<endl;
}
函数
函数的定义、声明、调用
函数的传参
#include <iostream>
using namespace std;
int main()
{
void inputIntArray(int arr[],int n);
void sortIntArray(int arr[],int n);
void printIntArray(int arr[],int n);
int arr[5]={0};
int n = sizeof(arr)/sizeof(arr[0]);
//获取键盘输入
inputIntArray(arr,n);
//对数组排序
sortIntArray(arr,n);
//对数组遍历
printIntArray(arr,n);
return 0;
}
void inputIntArray(int arr[],int n)
{
cout<<"请输入"<<n<<"个int数据:";
int i = 0;
for(i=0;i<n;i++)
{
cin>>arr[i];
}
return;
}
void sortIntArray(int arr[],int n)
{
int i = 0;
for(i=0;i<n-1;i++)
{
int j = 0;
for(j=0;j<n-i-1;j++)
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
return;
}
void printIntArray(int arr[],int n)
{
int i = 0;
for(i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
return;
}
#include <iostream>
using namespace std;
int main()
{
void myGetString(char str[],int n);
int myStrlen(char str[]);
char str[128]="";
//键盘获取字符串
myGetString(str,sizeof(str));
//测量字符串的长度
cout<<"长度:"<<myStrlen(str)<<endl;
return 0;
}
void myGetString(char str[],int n)
{
cout<<"请输入一个字符串:";
cin.getline(str,n);
return;
}
int myStrlen(char str[])
{
int i = 0;
while(str[i] != '\0')
i++;
return i;
}
预处理
内存分区
变量的存储
全局函数和静态函数
头文件包含
#define 宏
指针
指针变量
- 综合案例
数组元素的指针
int arr[5]={10,20,30,40,50};
int *p=arr;
int n=sizeof(arr)/sizeof(arr[0]);
//遍历数组
int i;
for(i=0;i<n;i++)
{
cout<<*(p+i)<<" ";//cout<<arr[i]<<" ";
}
cout<<endl;
- 例题
字符串与指针
指针数组
int num1 = 10;
int num2 = 20;
int num3 = 30;
int num4 = 40;
int *arr[4] = {&num1,&num2,&num3,&num4};
int n = sizeof(arr)/sizeof(arr[0]);
//遍历
int i ;
for(i=0;i<n;i++)
{
cout<<*arr[i]<<" ";
}
cout<<endl;
char *arr[4]={"scd","edee","dedede","edededed"};
int n = sizeof(arr)/sizeof(arr[0]);
//遍历
int i;
for(i=0;i<n;i++)
{
cout<<arr[i]<<endl;
}
指针数组只能读,二维字符数组可读可写
指针的指针
数组指针
多维数组的物理存储
指针与函数
#include <iostream>
using namespace std;
void setNum01(int data)
{
data=100;
}
int main()
{
int num = 0;
setNum01(num);//单向传递之传值
cout<<"num = "<<num<<endl;//修改不成功
return 0;
}
#include <iostream>
using namespace std;
void setNum02(int *p)
{
*p=100;
}
int main()
{
int num = 0;
setNum02(&num);//单向传递之传地址
cout<<"num = "<<num<<endl;//100 修改成功
return 0;
}
#include <iostream>
using namespace std;
//void ouputInArray(int arr[5],int n)
//一维数组作为函数的参数 会被编译器优化成指针变量
void ouputInArray(int *arr,int n)
{
cout<<"内部sizeof(arr) = "<<sizeof(arr)<<endl;
int i = 0;
for(i=0;i<n;i++)
{
//cout<<*(arr+i)<<" ";
cout<<arr[i]<<" ";
}
cout<<endl;
}
int main()
{
int arr[5]={10,20,30,40,50};
int n = sizeof(arr)/sizeof(arr[0]);
cout<<"外部sizeof(arr) = "<<sizeof(arr)<<endl;
// 遍历数组
ouputInArray(arr,n);
}
结果:
#include <iostream>
using namespace std;
void outputIntDoubleArray(int (*arr)[4],int row,int col)
{
cout<<"内部sizeof(arr) = "<<sizeof(arr)<<endl;
int i = 0,j = 0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int row = sizeof(arr)/sizeof(arr[0]);
int col = sizeof(arr[0])/sizeof(arr[0][0]);
cout<<"外部sizeof(arr) = "<<sizeof(arr)<<endl;
// 遍历数组
outputIntDoubleArray(arr,row,col);
}
结果:
函数指针
#include <iostream>
using namespace std;
int myAdd(int x,int y)
{
return x+y;
}
int main()
{
int (*p)(int x,int y)=NULL;
cout<<"sizeof(p) = "<<sizeof(p)<<endl;
//函数指针和函数入口地址建立关系
p = myAdd;
//通过p调用myAdd函数(函数+(实参))
cout<<p(10,20)<<endl;
}
结果:
函数指针变量使用typedef定义
#include <iostream>
using namespace std;
int myAdd(int x,int y)
{
return x+y;
}
int main()
{
//int (*p)(int x,int y)=NULL;
//给函数指针类型取别名
typedef int(*FUN_TYPE)(int x,int y);
FUN_TYPE p = myAdd;
cout<<"sizeof(p) = "<<sizeof(p)<<endl;
//函数指针和函数入口地址建立关系
p = NULL;
//通过p调用myAdd函数(函数+(实参))
cout<<p(10,20)<<endl;
}
动态空间申请
#include <iostream>
using namespace std;
int main()
{
int *p = NULL;
p = new int;//从堆区中申请int类型大小的空间
*p = 100;
cout<<"*p="<<*p<<endl;
//释放空间
delete p;
//new申请空间的同时 初始化空间内容
int *p1 = NULL;
p1 = new int(100);
cout<<"*p1="<<*p1<<endl;
delete p1;
return 0;
}
int *arr = NULL;
arr = new int[5]{10,20,30,40,50};
int i = 0;
for(i=0;i<5;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
//如果new的时候有[],那么delete时也需要[]
delete [] arr;
字符串处理函数
结构体
概述
结构体类型的定义
结构体变量的操作
结构体变量的初始化
清空整个结构体变量
使用memset清空结构体变量
#include <iostream>
#include <string.h>
using namespace std;
struct Stu
{
int num;
char name[32];
};
int main()
{
Stu lucy;
//清空整个结构体变量
memset(&lucy,0,sizeof(lucy));
cout<<lucy.num<<" "<<lucy.name<<endl;
return 0;
}
用键盘给结构体变量中成员赋值
struct Stu
{
int num;
char name[32];
};
int main()
{
Stu lucy;
//清空整个结构体变量
memset(&lucy,0,sizeof(lucy));
cout<<"请输入学号 姓名:";
cin>>lucy.num>>lucy.name;
cout<<lucy.num<<" "<<lucy.name<<endl;
return 0;
}
可以单独操作结构体中成员
单独操作结构体中成员必须遵循结构体自身的类型
相同类型的结构体变量之间赋值方法
三种方法:
#include <iostream>
#include <string.h>
using namespace std;
struct Stu
{
int num;
char name[32];
};
int main()
{
Stu lucy {100,"lucy"};
Stu bob;
#if 0
//第一种方法,逐个成员赋值(遵循成员类型)
bob.num = lucy.num;
strcpy(bob.name,lucy.name);
#elif 1
//第二种方法,相同类型的结构体变量 可以直接赋值(推荐)
bob = lucy;
#else
//第三种方式:内存拷贝(是第二种的底层实现)
memcpy(&bob,&lucy,sizeof(Stu));
#endif
cout<<bob.num<<" "<<bob.name<<endl;
return 0;
}
结构体嵌套结构体
结构体数组
结构体数组的定义
#include <iostream>
#include <string.h>
using namespace std;
struct Stu
{
int num;
char name[32];
};
int main()
{
Stu arr[5]={{100,"lucy"},{101,"bob"},{102,"tom"},{103,"得码"},{104,"小跑"}};
int n = sizeof(arr)/sizeof(arr[0]);
//清空数组
//menset(arr,0,sizeof(arr));
int i;
for(i=0;i<n;i++)
{
//数组的每个元素是结构体变量
cout<<arr[i].num<<" "<<arr[i].name<<endl;
}
return 0;
}
结果:
键盘给结构体数组赋值
#include <iostream>
#include <string.h>
using namespace std;
struct Stu
{
int num;
char name[32];
};
int main()
{
Stu arr[5];
memset(arr,0,sizeof(arr));
int n = sizeof(arr)/sizeof(arr[0]);
cout<<"请输入"<<n<<"个学员信息(num name)"<<endl;
int i=0;
for(i=0;i<n;i++)
{
cin>>arr[i].num>>arr[i].name;
}
//遍历
for(i=0;i<n;i++)
{
cout<<arr[i].num<<" "<<arr[i].name<<endl;
}
return 0;
}
结果:
结构体指针变量
指针结构体变量的定义
#include <iostream>
#include <string.h>
using namespace std;
struct Stu
{
int num;
char name[32];
};
int main()
{
Stu lucy={100,"lucy"};
Stu *p = &lucy;
//*p == lucy
cout<<lucy.num<<" "<<lucy.name<<endl;
cout<<(*p).num<<" "<<(*p).name<<endl;
//通过指针变量 使用->访问成员
cout<<p->num<<" "<<p->name<<endl;
//如果是地址可以直接使用->访问成员 如果是结构体变量 需要.访问成员
cout<<(&lucy)->num<<" "<<(&lucy)->name<<endl;
return 0;
}
结构体数组元素的指针变量
指针变量保存结构体数组元素的地址
#include <iostream>
#include <string.h>
using namespace std;
struct Stu
{
int num;
char name[32];
};
void inputStuArray(Stu *arr,int n)
{
cout<<"请输入"<<n<<"个学生信息(num,name)"<<endl;
int i = 0;
for(i=0;i<n;i++)
{
cin>>(arr+i)->num>>(arr+i)->name;
}
}
void sortStuArray(Stu *arr,int n)
{
int i;
for(i=0;i<n;i++)
{
int j;
for(j=0;j<n-i-1;j++)
{
if((arr+j)->num > (arr+j+1)->num) //arr[j].num
{
Stu tmp = *(arr+j);//arr[j]
*(arr+j) = *(arr+j+1);
*(arr+j+1) = tmp;
}
}
}
}
void outputStuArray(Stu *arr,int n)
{
int i = 0;
for(i=0;i<n;i++)
{
cout<<arr[i].num<<" "<<(arr+i)->name<<endl;
}
}
int main()
{
Stu arr[5];
memset(arr,0,sizeof(arr));
int n = sizeof(arr)/sizeof(arr[0]);
//封装函数获取键盘输入
inputStuArray(arr,n);
//对结构体数组按学号排序
sortStuArray(arr,n);
//输出结构体数组元素的内容
outputStuArray(arr,n);
return 0;
}
结果:
结构体的指针成员
结构体的指针成员定义
结构体指针成员指向
结构体的浅拷贝
结构体的深拷贝
#include <iostream>
#include <string.h>
using namespace std;
struct Stu
{
int num;
char *name;
};
int main()
{
Stu lucy;
lucy.num = 100;
lucy.name = new char[32];
strcpy(lucy.name,"lucy");
Stu bob;
bob.num = lucy.num;
bob.name = new char[32];
strcpy(bob.name,lucy.name);
cout<<bob.num<<" "<<bob.name<<endl;
delete [] lucy.name;
delete [] bob.name;
return 0;
}
结构体变量在堆区 结构体的指针成员也指向堆区
结构体的对齐规则
结构体的位域
共用体union
- 案例
union Data
{
char a;
short b;
int c;
};
Data ob;
ob.a = 10;
ob.b = 20;
ob.c = 30;
cout<<ob.a+ob.b+ob.c<<endl; //90
结果:
枚举enum
链表
链表的概述
静态链表
设计链表节点
学生管理系统(动态链表)
C++对C的扩展
面向对象编程概述
::作用域运算符
命名空间namespace
using声明 命名空间的成员 可用
struct类型增强
引用
普通变量的引用
int a = 10;
//需求: 给变量a取个别名叫b
//定义的时候 &修饰变量为引用 b就是a的别名(引用)
//系统不会为引用开辟空间
int &b = a;//引用必须初始化
//a和b代表同一空间内容
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"&a = "<<&a<<endl;
cout<<"&b = "<<&b<<endl;
//操作b等价操作a
b = 100;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
运行结果:
数组的引用
指针变量的引用
函数的引用
引用作为函数的参数
引用作为函数的返回值类型
常引用
内联函数
函数重载
函数的默认参数
占位参数
extern"C"浅析
类和对象
类和对象的基本概念
定义一个类
设计一个Person类
#include <iostream>
#include <string.h>
using namespace std;
class Person
{
private:
char mName[32];
int mAge;
public:
//初始化函数
void personInit(char *name, int age)
{
strcpy(mName,name);
if(age>0 && age<=100)
mAge = age;
else cout<<"输入的年龄:"<<age<<"不合法"<<endl;
}
//设置mAge
void setAge(int age)
{
if(age>0 && age<=100)
mAge = age;
else cout<<"输入的年龄:"<<age<<"不合法"<<endl;
}
//得到mAge
int getAge(void)
{
return mAge;
}
//设置mName
void setName(char *name)
{
strcpy(mName,name);
}
//得到mName
char *getName(void)
{
return mName;
}
//显示年龄和姓名
void showPerson()
{
cout<<"性命:"<<mName<<",年龄:"<<mAge<<endl;
}
};
设计一个立方体类
成员函数在类外实现
构造函数
初始化和清理
构造函数的概述
构造函数的定义方法
提供构造函数的影响
析构函数
析构函数的定义方式
拷贝构造函数
初始化列表
explicit关键字
类的对象数组
动态对象创建
静态成员