c++兼容c语言代码
使用c语言的代码有时要引用对应的头文件
c++头文件引用不写 后缀 .h (很老的版本加 .h ),如果是c语言的头文件,
在头文件名字前加 字母 c
比如 <stdlib,h> 在c++里写成 <cstdlib>
c++的标准输入输出流头文件 <iostream>
为了保证 C++ 标准库(iostream)和 C 标准库(stdio)在混用时不发生冲突,标准库的开发者们在实现 <iostream> 时,往往会在底层偷偷把 <cstdio> 的相关声明给包含进来。这就导致在包含 <iostream> 后,即使没有手动写 #include <cstdio>,也能直接使用 printf和scanf。
namespace 命名空间
给 变量,结构体 ,函数 加上命名空间 使在项目里不会因为重名而出现错误
只能定义在全局,可以嵌套定义
定义 写 name { 名字 }
c++标准库都放在一个叫 std 的命名空间中
using namespace XX 是展开命名空间中全部成员 项目不推荐
using 命名空间XX::名字XX 是展开命名空间中一个成员
using可以写在命名空间内部
编译查找一个变量的声明/定义时,默认只会在局部或全局查找,不会到命名空间内部去查找
所以要使用命名空间的变量/函数
1.指定命名空间的访问,项目中推荐 名字::名字
2.using 将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种办法
3.using 展开所有成员 ,不推荐
输入和输出
cin 是窄字节标准输入流
cout 是窄字节标准输出流
endl 是一个函数,流插入输出时相当于插入一个换行字符和刷新缓冲区
日常练习中可以 using namespace std ,实际项目开发不推荐
缺省函数
· 声明或定义函数时为函数的参数指定一个缺省值
在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参
缺省函数分为全缺省和半缺省参数
全缺省就是全部形参给缺省值
半缺省就是一部分形参给缺省值
c++规定缺省参数必须从右往左连续缺省
函数声明和定义分离时,缺省函数不能在函数声明和定义中同时出现,
规定在函数声明中写缺省值。
函数重载
c++支持在同一作用域中出现同名函数
但是要求形参不同,可以是参数不同或类型不同
就是传一堆实参俩函数要能区分开
引用 类型名& 别名
引用不是新定义一个变量,而是给已存在的变量起一个别名。
编译器不会为引用变量开辟内存空间
和引用的变量共用一块空间
子函数形参的引用表面传值,实参传值
本质传地址,只是这个工作由编译器来做
语义上引用不开空间底层引用就是指针,这俩底层没区别,只是表层写法和形式不同
引用必须初始化
引用一旦引用一个实体,再不能引用其他实体
引用const 修饰的对象时,引用前也要加const 禁止权限放大(const只读)
const引用普通变量只能读不能写
const引用可以给常变量取别名
例1:
double d = 13.14;
const int& ds = d; ✅(int& ds = d❌)
在类型转换中会产生临时对象存储中间值
c++中,临时对象具有常性,所以必须要常引用
例子2:
int a = 1,int b = 1;
const int& ab = (a+b);✅(int& ab = (a+b)❌)
俩变量相运算的结果算是存入临时常变量
所以是常量,引用加const就可以存
指针和引用的关系
① 语法概念上引用是一个变量的取别名不开空间,指针是存储着一个变量地址,要开空间。 在底层引用和指针没有区别
② 引用在定义时必须初始化,指针建议初始化但是语法上不是必须的。
③ 引用在初始化时引用一个对象后,就不能再引用其他对象, 而指针可以在不断地改变指向对象
④ 引用可以直接访问指向对象,指针需要解引用才是访问指向对象
⑤ sizeof 含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数 ⑥ 指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全一些。
inline 内联函数
用 inline 修饰的函数叫做内联函数,
编译时会在调用的地方展开内联函数,
就不需要建立栈帧,可以提高效率。
inline 适用于频繁调用的短小函数
对于递归函数、代码相对多一些的函数,加上 inline 也会被编译器忽略。
inline 是C++用来替代宏定义的
inline 声明和定义不建议分离到两个文件
分离会导致链接错误,因为inline被展开,就没有函数地址,链接时会出现报错。
nullptr替换NULL
在C++中 NULL 的值为0,表示空指针,但在某些函数重载中,如 f(int*) 和 f(int) 会报错,
传值时分不清这个0是 NULL 还是整型0。
C语言没有函数重载,不会出现这个问题。
于是C++11中引入 nullptr , nullptr 是一个特殊关键字。
nullptr 是一种特殊类型的字面量,它可以转换成任意其他类型的指针类型。
使用 nullptr 定义空指针可以避免类型转换的问题,
因为 nullptr 只能被隐式地转换为指针类型,而不能被转换为整数类型。
用 nullptr 代替 NULL 可以解决c++类型不准确的问题
c++代码推荐使用nullptr
c++不同类型要加强转
|-----------------------|------------------------------|
| c语言 | c++ |
| void* p1 = NULL; | void* p1 = NULL; |
| int* p2 = p1; (隐式转换) | int* p2 = (int* ) p1; (强转) |
