目录
一.Visual Studio下载配置环境
1.1下载地址
官网地址:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器
visual studio是免费的,因此官网下载即可,同时支持中文界面
社区版:可供非企业或开源开发者们免费访问
专业版:面向任何规模团队的可缩放、端到端解决方案
1.2安装visual studio
下载完之后启动安装程序,下载支持包
一定要选择安装这个,不然无法使用C++,接着点击右下角修改即可安装
二.创建新项目
2.1创建项目工程
2.2创建新项目
找到左侧解决方案资源管理器→源文件→右键添加→新建项
选择c++文件(.cpp)→更改名称→添加
空白文件已经创建好了,接下来可以写代码了
三.【第一课】书写Hello Word
C++的书写语法和C语言是有差异的,当我第一次看到该书写规则时还有些不习惯。
1.首先写框架,今后所写的程序基本上都包含此框架
2.写入hello word
3.运行效果
四、变量和常量
4.1变量的创建
作用:方便管理和存储数据至内存
变量创建语法:数据类型 变量名 = 变量初值,例:int A = 100
示例:
4.2常量的创建
作用:记录程序中不可更改的数据
两种方式:
1.#define 宏常量:#define 常量名 常量值
表示一个常量,必须定义在开头
2.const修饰的变量:const 数据类型 常量名 = 常量值
表示不可修改的变量
示例1:
示例2:
五.数据类型
5.1sizeof的使用
作用:用于判断数据类型或变量占用的内存大小
示例:
5.2浮点型(实数)
作用:用于表示小数
分为两种:
1.单精度float
2.双精度double
单精度定义:float f1=3.14f
(如果不加f,则默认双精度浮点数)
双精度定义:float f1=3.14 或 double f1=3.14
5.3科学计数法
示例:
3e3=3000
3e-3=0.003
5.4字符型
5.4.1字符型变量
作用:用于显示存储字符,且为单个字符
语法:char C = 'a'
·字符型变量占用1字节
·并不是将字符本身存储于内存中,而是将对应的ASCII码放入内存中
示例:
5.4.2显示字符ASCII码
若要输出字符串ASCII码,则在变量前加上(int),强制转换成整数型
示例:
5.5字符串型
作用:用于显示存储字符串,且为单个或多个字符
两种写法:
1.C写法:
语法:char C[] = "字符串值"
2.C++写法
语法:string C = "字符串值"
用之前需包含头文件:
[提示]字符串值为双引号
5.6布尔类型bool
作用:输出真(1)或假(0)
示例:
六.数据的输入
作用:用于从键盘获取数据
语法:cin>>变量
示例:
→→回车→
七.运算符
7.1前置和后置递增递减
加减运算符递增有两类:
前置递增:++a、后置递增:a++
实例:
运算过程为:a=(a+1)*10
运算过程为:a=a*10,当cout这一行代码执行完后,再执行a=a+1
7.2赋值运算符
赋值运算符共有:=、+=、-=、*=、/=、%=
方法:a=1、a=a+1、a=a-1、a=a*1、a=a/1、a=a%1
7.3比较运算符
作用:判断两个数是否相等、不等、大于、小于等,并返回真或假
示例:
7.4逻辑运算符
作用:判断表达式的值,返回真或假
[提示]在C++中,除0之外的值都为真
八.程序流程结构
三种基本结构:顺序结构、选择结构、循环结构
顺序结构:程序按顺序执行,不发生跳转
选择结构:程序按照满足条件,选择相应代码执行
循环结构:程序按照满足条件,多次执行某段代码
8.1选择结构
8.1.1 if语句
作用:执行满足条件的语句
语法:if(条件A)
{条件A满足,则执行代码A}
else if(条件B)
{条件B满足,则执行代码B}
else
{条件A和B都不满足,则执行代码C}
8.1.2三目运算符
作用:通过三目运算符实现语句判断
语法:表达式1?表达式2:表达式3
解释:如果表达式1为真,则执行表达式2,并返回表达式2的结果;如果表达式1为假,则执行表达式3,并返回表达式3的结果
示例:
同时还可以为a或b变量赋值:
第二行a>b为假,所以返回b,令b=100,结果为:
8.1.3 switch语句
作用:执行多条件分支语句
语法:
switch(表达式)
{
case 结果1:执行语句1;break;
case 结果2:执行语句2;break;
...
default:执行语句n;break;
}
示例:
8.2循环结构
8.2.1 while循环语句
作用:满足循环条件,执行循环语句
语法:while(循环条件){循环执行代码}
示例:
8.2.2 do while循环语句
作用:与while不同之处在于,判断循环条件之前首先执行一次do中的代码
语法:
do{循环执行代码}
while(循环条件)
8.2.3 for循环语句
作用:满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;末尾循环体){循环语句}
8.3跳转语句goto
作用:跳过剩下的代码执行,直接跳转到标记处执行代码
语法:goto flag
示例:
[注意]应避免使用goto,容易造成代码混乱,不易阅读
九.数组操作
9.1创建数组
一维数组:
创建数组三种方式:
1.数组类型 数组名[n]
2.数组类型 数组名[n]={1,2,3,...,n-2,n-1,n}
3.数组类型 数组名[]={1,2,3,...,n-2,n-1,n}
示例:
二维数组:
创建方式和一维数组类似,m是行,n是列
数组类型 数组名[m][n]
示例:
9.2数组内存地址
直接在数组名前面加上&,代表指针
示例:
查看数组中第2个元素的内存地址:
十.指针
10.1指针的定义和使用
创建指针:
*p:表示存放指针
&a[0]:表示读取a[0]的地址
p指示的是a[0]的地址,a[1]地址=a[0]地址+4
使用指针:
作用:修改或引用指针指向的内存数据
示例:
[注意]如果a[8]变量不为数组,是单个值,则p[0]应该为*p
示例:
10.2空指针
作用:用于初始化指针变量
示例:
10.3野指针
作用:指针变量指向非法内存空间,程序中应尽量避免胡乱访问,否则会出错
示例:
这是胡乱定义的一个内存地址
10.4常量指针
作用:指针指向的地址可以改,但指向的内存里面的值不可以修改赋值
语法:float a[8]={-1,-1.1,1.5,4,0,5,7,3};
const float *p=&a[0];
示例:
10.5指针常量
作用:指针指向的地址不可以改,但指向的内存里面的值可以修改赋值
语法:float a[8]={-1,-1.1,1.5,4,0,5,7,3};
float * const p=&a[0];
示例:
10.6常量既修饰指针又修饰常量
作用:指针指向的地址不可以改,且指向的内存里面的值也不可以修改赋值
语法:float a[8]={-1,-1.1,1.5,4,0,5,7,3};
const float * const p=&a[0];
示例:
10.7指针和数组
作用:利用指针访问数组元素
示例:
访问a数组中第一个元素:
访问a数组中第二个元素:
10.8指针和函数
10.8.1地址传递至函数
作用:在子函数中可对传入的地址中的实参进行修改
单个值:
数组:
十一.结构体
11.1结构体的创建和会用
作用:用户自定义数据结构类型
示例:
自定义一个结构体:
创建结构体变量:
给结构体赋值:
打印结构体某个元素:
11.2结构体指针
作用:通过指针访问结构体中的属性
语法:p->name
示例:
11.3结构体嵌套
作用:在某一个结构体中嵌套另一个结构体
示例:
十二.内存管理
12.1 new创建内存空间
作用:开辟一块内存空间,由程序员自行操作、施放,不会被程序自动施放
语法:int *p=new int (10)
示例:
这个就是开辟的一块内存,初始值为5
这就是开辟的一块内存数组,初始值分别是1,2,3
12.2 delete删除内存空间
作用:释放内存,由new创建的内存尽量使用delete释放,否则会造成内存泄漏
语法:释放非数组:delete p
释放数组:delete[] p
12.3内存引用
作用:给一块内存取别名
语法:数据类型 &别名=原名
说明:引用必须初始化,如:数据类型 &b,这是错误的引用。一旦初始化后,不可以更改引用,如:首先引用 数据类型 &b=a,再引用 数据类型 &b=c,这是错误的。
12.4引用做函数参数
作用:函数传参时,可以利用引用计数让形参修饰实参
优点:简化指针修改实参
示例:
图12.4.1
图12.4.2
图12.4.3
解释:图12.4.2中,swap(a,b)其中的a和b是实参,当传入swap函数时,如图12.4.1,由于形参为int &a和int &b,相当于引用了实参a和b的内存,指向实参a和b的内存地址,所以当子函数swap()中对a和b修改时,会直接对实参a和b内存中的值进行修改
十三.类和类模板
作用:模板可以使得程序员编写独立于数据类型的通用代码。模板使得数据类型成为一个参数,使得通用代码可以用于不同的数据类型。使用模板,程序员可以编写具有通用性的函数、类和数据结构来处理不同类型的数据。
13.1类模板创建
作用:建立一个通用类,类中的成员、数据类型可以不具体制定,用一个虚拟类型来表示
语法:template<class typename T>
示例:
在不使用this关键字的情况下,直接写出m_Name = name; 也是可以的。但是在类中,通常会存在与成员变量同名的局部变量或参数变量,这样会导致编译器无法区分使用局部变量还是成员变量,造成二义性。因此,使用this可以明确地指示使用的是该对象的成员变量,防止二义性的发生,提高了代码的可读性和可维护性
其中,<string, int>是由于类模板无法自动推导类型,因此需要<string, int>传入,这样使得数据类型也可视为变量
13.2模板对象作函数参数
作用:将模板对象作为某个函数的参数传入
指定传入类型(常用):
示例:
可以看到子函数ls1的参数为person<string, int> &p
参数模板化:
将子函数ls1中的参数类型(person<string, int> &p)写成(person<T1,T2> &p),即可参数模板化
整个类模板化:
将子函数ls1中的参数类型(person<string, int> &p)写成(T &p),即可参数模板化
13.3类模板与继承
示例:
13.4成员函数的类外实现
示例:
13.5类模板与友元函数
全局函数类内实现:
示例:
全局函数类外实现:
开头声明
十四.容器vector
14.1 vector中存放类
作用:将类存入vector中
示例:
14.2 vector嵌套vector
示例: