Cmake
- CPP程序开发过程
- 计算机硬件—>机器语言—>汇编—>cpp
- cpp—>机器(gcc)
- Make(makefile)—>本地智能批处理翻译机制
- Cmake—>跨平台生成不同设备上的makefile进行执行
Cpp基础学习
基本知识
#include<iostream>
using namespace std;
int main(){cout << "hello cpp" << endl;system("pause");return 0;
}
- 变量
- 意义
- 16进制可以表示一个内存空间—>给内存起名称a—>a就是变量
- 创建
- 常量
- 不可修改的数据
- 定义方式
- #define宏定义—#define 常量名 常量值
- const修饰变量 const 数据类型 常量名 = 常量值
- 关键字
- 标识符名规则
- 标识符不可以是关键字
- 标识符只能由字母数字下划线
- 第一个字符不能为数字
- 标识符区分大小写
数据类型
- 存在意义—给变量分配合适的内存空间
- sizeof—输出字节—取决于多少位的操作系统—统计数据类型所占内存大小
- 有效数字—所有展示数字的位数
- 实型—浮点型
- float—4字节
- double—8字节
- 默认定义数据是double因此,float f1 = 3.14f这样才能真正定义为float
- 一般显示6位有效数字
- 字符型—表示单个字母—占用一个字节—char
- 单引号
- 字符型变量并不是把字符本身放入内存中存储,而是将对用的ascii编码放入到存储单元
- 查看ascii—cout<< (int)ch << endl;
- 常见
- 转义字符
- 用于表示一些不能显示出来的ascii字符
- 常见
- \n—换行
- \t—水平制表—8个字符空间
- //—反斜杠/必须输出两个
- 字符串型
- 两种风格
- char 变量名[] = “字符串” — C风格
- string 变量名 = “字符串” — CPP风格 — #include
- 布尔数据类型
- 数据的输入
int a = 0;
cout<< "请输入a: \n" << endl;
cin >> a;
新型类型转换方式
- c语言—(type)(expression)
- 缺点
- 这种类型转换容易产生不良后果
- 在源码中无法快速定位所有使用强制类型转换的语句
- cpp将强制类型转换分为四种不同类型
- 四个不同的关键字
- static_cast—静态类型转换
- 用于基本类型间的转换
- 不能用于基本类型指针间的转换
- 用于有继承关系类对象之间的转换和类指针之间的转换
- const_cast
- 用于去除变量的只读属性
- 强制转换的目标类型必须是指针或引用
- dynamic_cast—只能用于指针间
- 用于有继承关系的类指针
- 用于有交叉关系的类指针间转换
- 具有类型检查功能
- 需要虚函数的支持
- reinterpret_cast
- 用于指针类型间的强制转换
- 用于整数和指针类型间的强制转换
运算符
流程结构
- 选择结构
- if
- 三目运算符
- switch
- switch中表达式类型只能是整型或者字符型
- switch不可以判断区间
- 循环结构
- 跳转语句
一维数组
- 特点
- 定义
- 数据类型 数组名[数组长度]
- 数据类型 数组名[数组长度] = {数值1, 数值2…}
- 数据类型 数组名[] = {值1, 值2,…};
- 数组名的用途
- 可以统计整个数组在内存中的长度
- 可以获取数组在内存中的首地址
int arr[] = {1,2,3}
int len = sizeof(arr)
int ev_len = sizeof(arr)/sizeof(arr[0])
- 数组首地址访问的两种形式
- cout << arr
- cout << &arr[0]
- 元素和地址访问不一样
二维数组
- 定义方式
- 数据类型 数组名称[行数][列数]
- 数据类型 数组名称[行数][列数] = {{1,2,3},{2,3,4}}
- 数据类型 数组名称[行数][列数] = {1,2,3,2,3,4}
- 数据类型 数组名[][列数] = {1,2,3,2,3,4}
- 数组名称
函数
- 值传递问题
- 函数声明
- 分文件编写
- .h文件中包含.cpp中的所有库函数依赖,只声明不定义
- .cpp关联后只需要定义即可
指针
- 概念
- 通过指针间接访问内存
- 通过指针变量记录内存的地址编号
- 指针就是用来保存地址
- 定义指针
- 初始化方式
- *p代表解应用—可以修改数据
- 指针所占的内存大小
- 32位操作系统下占用4个字节—sizeof后不论什么类型只要是指针,占的内存只依赖于操作系统的大小
- const修饰指针
- const修饰指针—常量指针—const int * q = &a—指针的指向可以改,但是指针指向的数值不能改
- const修饰常量—指针常量—int * const p = &a—指针的指向不可以改,但是指针指向的数值可以改
- const修饰指针同时又修饰常量—const int * const p = &a—指针的指向和指针指向的值都不可以改
指针和其他的配合使用的配合使用
- 利用指针访问数组中的元素—数组名就是数组第一个元素的地址
- 指针和函数—地址传递—实现对调用主函数变量的修改
结构体
- 概念—结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
struct student
{string name;int age;
};
struct student
{string name;int age;
}ss;
struct student s1;
student ss;
struct student s2 = {...};
s1.name = "zhangsan";
struct student s1[] = {{"zhangsan", 18},{"lisi", 22}
};
s1[1].age = 32;
struct student s1[] = {{"zhangsan", 18},{"lisi", 22}
};
struct student * ss = s1;
cout << ss->age << endl;
struct student {string name;int age;
};
struct teacher t1{string name;int age;struct student s1;
};
- 结构体做函数参数
- 值传递—形参改变实参不变
- 地址传递—形参变实参也变
- 将值传递改为地址传递可以保证传参过程中开销较小
- 但是这种方式会导致函数内可以改变结构体信息
- 解决—const加入
- 在函数形参加上const即可 void test(const int *s)