2020/8/10 -12,暑假留校,导师讲解C++基础语法时所做笔记。
C++程序设计
开发环境
VS 2019 社区版
将解决方案和项目放在同一个目录中 勾选上
重要视图
解决方案资源管理器
类视图
重要文件
.vcxproj
.sln
基础语法
注释
// 单行
/* */ 多行
编译
编译型语言
编译 -> 链接
编译得到.obj
文件
调试
-
调试 -> 设置断点 -> 开始调试 -> 逐语句
-
错误类型 C 表示编译错误
-
错误类型 LINK 表示链接错误 找不到函数定义
-
调试 -> 窗口 -> 调用堆栈 查看调用关系
变量定义
int
整型 、float
单精度浮点型、double
双精度浮点数、string
字符串
数组
静态数组 double z[50];
中括号中必须为常数
动态数组 double* z = new double[n]
使用指针
释放内存 delete []z
函数
C语言为面向过程语言,C++支持面向对象
函数需要声明。
重载:函数名相同,参数列表不同
面向对象
类
class CCrossSection
{
CCrossSection()
{
// 初始化
}; //构造函数
~CCrossSection()
{
delete []d;
//释放资源
}; //析构函数
double m_c; //全局变量
void fun1(); //成员函数
void fun2();
public: //公有
int a; //成员变量 //局部变量
protected: //保护
private: //私密
float b;
}
派生和继承
class CRectCrossSection : public CCrossSection
{
//CRectCrossSection 继承 CCrossSection
}
结构
与类极为相似,仅有区别为构造函数和析构函数为public
struct sSection
{
sSection()
{
}
~sSection()
{
}
}
实例
CCrossSection section1; //实例
section.m_iNum = 5;
section1.fun1();
代码规范
- 多加空格
- 多加注释
i
表示整型,d
表示double
例如m_iNum
m
表示全局- 在构造函数中赋初始值,析构函数中释放空间
- 将变量设为
protected
,设函数改变该值,方便调试
头文件
.h
头文件只放类的声明
#include "CrossSection.h"
引入类
函数实现放在CrossSection.cpp
中
指针
CCrossSection* pSection1 = new CCrossSection;
pSection1 -> SetNum(5);
pSection1 -> fun1();
指针的生命周期人为控制;不会自动析构,可根据需要析构。这点与实例不同。
复用
基类/父类
class CStruct
{
public:
CStruct(){};
~CStruct(){};
protected:
double m_dInvertedElevation;
public:
void SetInvertedElevation(double dEle);
double GetInvertedElevation();
virtual void RunModel(); //虚函数
}
派生类/子类
class CStruct_InvertedSiphon : public CStruct
{
public:
CStruct(){};
~CStruct(){};
protected:
double m_dOutElevation;
public:
void SetOutElevation(double dEle);
double GetOutElevation();
void RunModel(); //实函数
}
在父类中设置虚函数,指针自动调用合适的函数。
CStruct* pStruct1 = new CStruct_InvertedSiphon();
pStruct1 -> RunModel();
CStruct* pStruct2 = new CStruct_AreaChange();
pStruct2 -> RunModel();
delete pStruct1;
delete pStruct2;
向量
#include <vector>
std::vector<CStruct*> pStructs; //向量 容器
CStruct* pStruct1 = new CStruct_InvertedSiphon();
CStruct* pStruct2 = new CStruct_AreaChange();
pStructs.push_back(pStruct1);
pStructs.push_back(pStruct2);
for (int i = 0; i < pStructs.size(); ++i) //C++中的循环
{
pStructs[i] -> RunModel();
}
删除向量
for (int i = 0; i < pStructs.size(); ++i) //C++中的循环
{
delete pStructs[i]; //删除指针所指的位置
}
pStructs.clear(); //清空容器
map
#include <map>
CStruct* pStruct3 = new CStruct_InvertedSiphon();
CStruct* pStruct4 = new CStruct_AreaChange();
CStruct* pStruct5 = new CStruct_InvertedSiphon();
std::map<std::string, CStruct*> pMapStructs; //键值对 哈希表 字典 映射
pMapStructs["第一倒虹吸"] = pStruct3;
pMapStructs["第二渐变段"] = pStruct4;
pMapStructs["第三倒虹吸"] = pStruct5;
pMapStructs["第一倒虹吸"] -> RunModel();
pMapStructs["第二渐变段"] -> RunModel();
pMapStructs["第三倒虹吸"] -> RunModel();
删除向量
通过迭代器删除
std::map<std::string, CStruct*>::iterator it; //定义迭代器
for (it = pMapStructs.begin(); it != pMapStructs.end(); ++it)
{
delete it ->second;
}
pMapStructs.clear();
判断
if ()
{
}
else if ()
{
}
else
{
}