C++程序
文件扩展名
C++源代码的文件扩展名.cpp、.C、.cxx、.c(需要指定编译语言)
头文件
标准库中的头文件是不带.h的
#include
自定义的头文件保留.h
C语言的头文件可以继续使用
#include
输入输出
cin >> 输入
cout << 输出
endl 换行
cin和cout不再使用占位符,会自动识别数据类型
scanf、printf可以继续使用
编译器
gcc可以编译C++源码,但是需要额外的参数
g++是编译C++源码的最简单的编译器,操作系统没有默认安装
ubuntu系统的安装指令
sudo apt-get install g++
gcc的编译参数可以继续使用
C++编译时的错误提示不精准,一个错误可能会产生大量的错误提示
名字空间
using namespace std;
C++中的基本数据类型
C++兼容C语言中的所有数据类型(C++兼容C有语言的所有语法)
添加了bool类型
字节宽度为1、值 true(!0)/false(0)
输出时添加参数boolalpha,可以将值的显示格式转换成 true/false
void *与其他类型的指针转换受到限制
void *不可以直接给其他类型的指针赋值,必须经过强制转换
任意类型的指针都可以给void *赋值
C++中的联合、枚举、结构
在C++中联合、枚举、结构设计成功后,再使用不需要添加关键字
枚举的检查更为严格(枚举成为一种独立的数据类型)
结构成员中可以有函数,在函数中可以直接访问结构成员
结构对象可以继续使用.或->访问成员或成员函数
结构成员添加了访问属性
public 开放,任何位置都能使用
private 私有,只能在成员函数中使用
protected 保护
结构在创建时会自动调用一个函数,即构造函数
函数名 结构名
参数任意
无返回值
结构在释放时会自动调用一个函数,即析构函数
函数名 ~结构名
无参数
无返回值
引用
再定义
引用必须初始化,否则编译错误
不仅可以引用标识符,也可以引用立即数(右值、字面值、常量),但必须加const属性
不能定义空引用,但悬空引用是存在的(引用了堆内存的数据,当堆内存释放后就不应该再使用)
引用是一次性的,无法再更改,引用一旦成功,就成为变量,不会再改变
引用也可以当作函数的参数,引用的对象是函数的实参,达到类似指针的作用
函数之间共享变量
提高参数的传递效率(高于指针)
可以获取参数
引用可以当作函数的返回值,但不能返回局部变量引用
能使用引用就不要使用指针了,但引用不能完全代替指针
内存管理运算符
在C++中使用 new/delete 来管理内存,new 用来申请内存, delete 用来释放内存
new 在申请内存时允许对内存进行初始化
使用 new 创建结构对象时会自动调用构造函数, delete 时会自动调用析构函数
malloc/free 与 new/delete 区别
malloc/free 函数在使用时需要添加头文件,new/delete 是C++中的运算符,不需要头文件
malloc 返回值是void*指针,new 返回的是有类型的指针
malloc 创建对象时不会调用构造函数,free 时不会调用析构函数, 但 new/delete 会调用构造函数以及析构函数
使用malloc使用内存时需要自己计算字节数,而使用 new 的时候自动计算
[]可以配合 new/delete 申请/释放数组
new[] 只能和 delete[] 配合使用,new[] 了多少个对象就会调用多少次构造函数,delete[]就会调用多少次析构函数
new/delete 与 malloc/free 不能混用
delete 不可以重复释放,但是可以连续释放空指针
使用new申请内存失败会抛出异常"std::bad_alloc"
C++中的函数
C++中函数可以在main前执行,C不行
C++中函数名字可以相同,只要参数不同即可(函数重载,不只是参数)
函数可以重名,并不是真正意义上的重名,只是在编译期间在函数名中添加了额外信息(函数的参数)
内联函数
把函数编译成二进制,然后在需要的位置直接把函数拷贝过去,而不是跳转后才执行,这样可以减少进出栈和调用,以此提高程序的执行效率,但这样会增加可执行文件的大小
内联函数与宏函数的区别
从本质上来说是一样的,但内联函数可以检查参数,也可以具有返回值
inline 返回值 函数名(参数);
C++中函数可以有默认值
函数的默认参数要靠右
默认参数尽量少用,可能发生重载错误
函数的默认参数是编译器在编译时帮助赋值的,所以只能由全局变量、静态变量、字面值对参数进行赋值