C++试水
C++试水
- 稍微学了一点c++,然后放弃了。。。
- 这里是学习笔记
- 学习平台在此
大门
- 下载安装MinGW,并设置环境变量
- 下载Code::Block软件
- Code::Block->设置->编译器->可执行工具链->自动侦测编译器的安装目录
使用旧方法创建工程
- 使用Code::Blocks运行C++文件
- 在新建路径内创建
.cpp
文件 - 为了生成执行文件exe,于是使用控制台cmd,在该文件目录内:
g++ -o 执行文件名 代码文件名.cpp
- 在新建路径内创建
- 运行Code::Block
使用新方法创建工程
- Code::Block->文件->新建->项目->ConsoleApplication
(一)你好世界
1 |
|
注释
1 | // 单行注释 |
(二)C++文件结构
1 | //头文件(.h)的内容与源文件(.cpp)中的内容一致,都是 C++ 的源代码。 |
(三)数据类型
主要类型
数据类型 | 字符 | 位数 | 取值范围 |
---|---|---|---|
整型 | int | 32 | -2^31~2^31-1 |
短整型 | short | 16 | -2^15_2^15-1 |
长整型 | long long | 64 | -2^63~2^63-1 |
单精度浮点 | float | 32 | -3.4e-38~3.4e+38 |
双精度浮点 | double | 64 | 1.7e-308~1.7e308 |
字符 | char | 8 | -128~127 |
强制转型
1 | float a = 10.5; |
常量与宏定义
1 |
|
(四)运算符
算数运算符
1 | ++ -- 递增 递减 |
其他运算符
1 | = 赋值运算符 |
(五)条件
如果、就、否则
1 | if (true) |
当、就、否则
1 | int i = 0; |
(六)循环
while循环
1 | int i = 1; |
do-while循环
1 | int i = 1; |
for循环
1 | for (int i = 0;i < 100;i++) |
(七)数组
定义
1 | int num1[] = {1, 2, 3, 4}; |
动态赋值
1 | int num[100]{}; |
数组长度
1 | //sizeof()函数可以用来计算数据的比特大小 |
排序
冒泡排序
1 | int nums[]{10, 47, 8, 25, 20, 54, 61, 40}; |
遍历
1 | int nums[10]; |
(八)向量(动态数组)
定义
1 | vector<float> vect1; |
常用函数
1 | vect1.clear(); //移除所有数据 |
遍历
1 | vector<int> vect; |
(九)指针与引用
指针定义
1 | int * p_num; |
指针赋值
1 | int num = 10; |
指针调用
1 | int num = 10; |
任意指针、空指针、野指针
1 | int num = 10; |
指针与const
- 当只有一个const时,如果const位于星的左侧,表示指针所指的数据是常量,无法通过该指针修改此数值,但指针本身是变量,可以指向其他数值
- 当只有一个const时,如果const位于星的右侧,表示指针本身是常量,不能指向其他数值,但指针所指的数据是常量,可以通过该指针修改数值
1 | int num = 10; |
指针特殊情况
1 | char ch = 'c'; //char型指针默认为字符串 |
动态分配内存
1 | //指针用法:在运行阶段分配未命名的内存以存储值 |
指针数组与数组指针
指针数组
- 指针数组是由多个单个指针构成的数组
1 | int* ptr[3]{nullptr, nullptr, nullptr}; |
数组名指针
- 数组名都是指针,都是指向数组中第一个元素的常量指针
1 | float num1[10]; |
数组指针
- 数组指针是一个数组的指针,可以是“指针数组”的指针
1 | int array1[3]{10, 20, 30}; |
误区
1 | int num[3] = {1, 2, 3}; |
引用定义
- 引用即为对象起另外一个名字
1 | int num = 100; |
(十)函数
定义
- 函数需要
定义原型
与定义实现体
后才能使用
1 | int function_int(float);//函数原型声明 |
- 如果
函数实现体
在主函数之前
声明,则可以不用声明函数原型
(最好是要写) - 如果
函数实现体
在主函数之后
声明,则必须在主函数前声明函数原型
函数原型
的存在目的就是为了在主函数前通知编译器函数的存在
1 | int function_int(float f)//实现体 |
形参改变实参值值不变
- 形参是实参的复制品,不会逆影响
1 | void addSelf(int); |
使用引用形参来修改实参
1 | void selfAdd1(int);//变量 |
函数指针
- 函数的地址是存储其机器语言代码的内存开始地址
函数指针声明
1 | int sum(int, int);//函数原型声明 |
使用示例
- 函数可以通过
函数指针
的方法来作为其他函数的传参
1 | int sum(int, int);//函数原型声明 |
内联函数
- 编译器调用
普通函数
时,需要去查找函数地址去执行函数 - 而调用
内联函数
时,只需要复制插入函数语句去执行即可
1 | inline int add(int, int); |
函数与引用
引用返回值
- 不要返回局部变量的引用,因为不干净
1 | int& selfAdd(int); |
函数左右值与引用
1 | int& sum1(int&); |
函数默认参数
- 可以在
定义原型
或者定义实现体
时给函数的参数一个默认值 - 但是不允许在两个地方同时赋值
- 当有多个参数时,赋默认值的参数后的所有参数也必须得有默认值
1 | void print(int = 10);//在定义原型时赋值 |
函数重载
- 重载指可以有多个同名的函数
- 这些函数名称相同,但参数列表不同
- 引用作为传参属于相同参数类型
- 传参时不区分const标
1 | void print(string);//print函数 |
模板函数
- 函数模板即建立一个通用函数
- 函数定义时不指定具体的数据类型
模板函数
的意义是在函数内声明一个虚拟的数据类型- 编译器会自动推断
模板函数
虚拟数据类型的数据类型
1 | template<typename T1, typename T2> void print(T1, T2, T1);//T1和T2是虚拟数据类型 |
(十一)类
面向个体(面向对象)
- “个体(对象)”在程序中是由数据和方法组成的封装体,并基于模拟现实来做对应
- 类是概念的抽象,个体(对象)是类的实例
头文件.h
1 |
|
源文件.cpp
1 |
|
主函数调用
1 |
|
访问修饰符
1 | public://修饰的成员在任意地方都可以访问 |
类与结构体
- 类的
默认成员
是私有的private - 结构体
默认成员
是公有的public
1 | class Student{} |
面向个体之封装
- 外部访问类中私有成员变量,使用封装函数
- 当某个值确实需要私有化,且允许获取与设置时,使用自定义Get和Set函数进行封装
1 | // 头文件 -------------------------------------- |
构造函数
- 构造函数以类名作为函数名,且构造函数没有返回值
- 构造函数在实例被构造时会调用
- 构造函数一般用于进行成员变量的初始化
1 | // 头文件 ------------------------------- |
析构函数
- 析构函数以“~”与类名作为函数名,且构造函数没有参数
- 析构函数在实例过期时会调用
- 析构函数一般用于进行成员变量的清理
1 | // 头文件 ------------------------------- |
this指针
- 包括构造与析构,类中每一个
成员函数
都有一个this指针 - this指针指向当前调用个体(对象)
- 可以通过
this->
或(*this).
来获取当前个体(对象)的成员
1 | // 头文件 ------------------------------- |
友元函数
- 友元函数不是任何类的成员函数,却可以访问被允许类的私有数据
1 | // 头文件 ------------------------------- |
面向个体之继承
- 继承即在一个已经存在的类的基础上再新建一个类,子类共用父类成员
- 继承可以是
公有继承
、私有继承
以及受保护继承
1 | // Human头文件 ------------------------------- |
面向个体之多态
- 多态性包括不同个体共用同一个函数调用,不同的个体在接收时会产生不同的行为
构成多态的条件
- 必须存在类的
继承
关系 - 必须有派生类
重写
基类的成员虚函数
- 在外部使用基类的
类指针
来调用虚函数
多态多么变态
- 当派生类重写基类中的成员函数时,将基类中被重写的函数设为虚函数
virtual
- 如果不添加
virtual
关键字,编译器就会根据当前个体类型调用其类型的成员方法
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Iamsleepingnow 世界!