1.从C到C++
语言的区别
C语言
编译性语言
面向过程语言
灵活
移植性好
效率高
shell
解释性语言
面向过程语言
Linux运维
C++
编译性语言
面向对象
面向对象语言效率最高的
应用领域:系统开发(APP开发,服务器开发),引擎开发,游戏开发,嵌入式开发,GUI界面开发。
python
解释性语言
面向对象
人工智能,绝大部分都是python开发的
应用领域:系统开发(APP开发,服务器开发),游戏开发,运维,爬虫,大数据,GUI界面开发,人工智能
面向过程
把需求/问题,拆解成一个个步骤
程序=数据结构+算法
面向对象
将需求/问题,抽象成多个对象
程序=对象+对象间的通信机制
2.C++与C的差异
编译一个C++程序
C++的文件后缀
有很多:.C,.cc, .cpp, .c++, …
推荐使用:.cpp
原因:通用。各种操作系统,各种IDE软件都是识别。
编译
Linux:g++
注意:理论上C语言用gcc,C++用g++。
windows:MinGW
IDE
QT
Vscode
Dev-c++
。。。
2.1更加严格的语法检查
1.更加严格的类型检查
char a = 'A'; int *q = &a; char *p = malloc(1); c++会直接报错
2.更加严格的函数形式
1.返回值 如果函数不是void,那么需要返回值,否则报警告 2.形参 如果没写,默认是void。不能传实参,否则报错
3.不允许同名的全局变量
int a; int a; C++会直接报错
4.可以对寄存器类型取地址
只要编译器发现你有这个操作,register变成auto
5.新增布尔(bool)类型
true--1 false--0
2.2const
C:
对于C语言来说,const只修饰变量名
C++:
有点类似于#define,在预处理的阶段进行替换
1.绝对的常量,不能直接修改
2.必须初始化
3.可以间接修改,volatile(易变的)
volatile const int var = 10; // 必须定义在其他文件 在本文件中,extern引入
和宏常量的区别:
1.宏的边缘效应
2.错误检查
推荐各位,使用const而不是宏常量
定义及初始化
左值引用–引用普通的变量
<存储类型> <数据类型> &引用名;
int a = 10;
int &r = a;
右值引用–引用临时变量
int &&r;
移动构造。
使用
和普通变量名一样使用
r+=10;
特点
1.必须初始化,没有空引用。(空引用相当于是野指针)
2.引用在初始化后,不能引用其他空间。(只会修改内容)
3.一个变量可以被多次引用。(一个人,可以有很多外号)
4.不能直接引用地址类型(破坏了引用的使用规则)
int * (&qqq) = p; *qqq = 777; 给一个指针取别名
引用和函数
作为参数
相当于地址传递,获取的是实参的空间
和变量名一样使用
作为返回值
1.可以作为左值
fun_referance() = 99; r = 99; 修改引用的内容
2.如果返回局部变量,需要加static。
2.5函数高级
内联函数
也叫做内嵌函数
是什么?
就是一个函数
在计算机编译阶段,将函数的代码拷贝到函数的调用处
有什么用?
以空间换时间
定义
inline void fun()
{}
特点
优势:减少函数的跳转,效率更高
劣势:代码量更大
0.相当于对编译器的一个建议
1.代码量很小(一般是5条语句以下)
2.频繁使用
3.声明和定义必须写在同一个文件里面(计算机需要在编译时,知道代码长什么样)
可以看汇编代码,来验证内联函数
和宏函数的区别
1、宏函数在预处理阶段,进行替换。内联函数在编译时进行替换。
2、内联函数本质上还是函数,编译器会检查语法错误
默认参数
函数的形参,可以有默认的值
函数不传实参,那么就使用默认值
函数传了实参,实参会覆盖默认值
特点
1.必须从后往前写默认参数
2.当函数有默认参数时,声明和定义需要写到一起。
3.引用类型不能有默认的值,可以有默认的变量
$$$函数重载overload
概念
函数名相同,但是功能/内容不同
特点
1.函数名
2.参数必须不一样(类型,数量)
3.处在同一个名字空间下面
思考
1.函数重载和默认参数
2.形参是引用类型,可不可以区分?
3.计算机在什么时候,知道该调用哪个函数的。在什么时候确定?
编译时确定。
3.内存模型和名字空间
作用域
概念
描述了一个名字在文件(编译单元)的多大范围内可见。
局部域
模块
函数
类域
不同的类,是单独的作用域
名字空间域
不同的名字空间,是单独的作用域
链接性
概念
描述了名称如何在各个单元中的共享
空链接
只在模块内可用
内部链接
本文件中使用
外部链接
可以在其他文件中使用
语言链接性
C++的程序,可以使用C的函数
存储性
自动:auto
静态:static
动态:malloc,new
new和delete
为什么不直接用malloc和free?
如果用malloc开辟对象空间,不会调用构造函数
new
用法
1.开辟一个元素的空间
int *p = new int;
2.开辟一个数组的空间
int *arr = new int[5];
3.开辟一个对象的空间
类 *p = new 类名;
初始化
int *p = new int(99);
int *arr = new int[5]{1,2,3};
Studen *zs = new Student(90, 'f', 18);
delete
1.回收单个元素
delete p;
2.回收数组空间
delete []arr;
计算机会记录每个内存块的大小和状态信息
名字空间
概念
一种作用域
作用
解决代码里面,标识符重名的问题
定义
namespace 标识符(名字)
{
任何内容
变量
函数
对象
}
使用
1.单独使用
名字空间::内容
::,表示作用域限定符
作用域::内容
2.整个程序使用
using namespace 名字;
直接使用内容