c++ 入门基础

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; (强转) |

相关推荐
糖果店的幽灵1 小时前
LangChain 基于 Python 的技术- agent模块使用总结
开发语言·python·langchain
weixin_386468961 小时前
openharmony 6.0编译rk3568过程记录
c语言·c++·git·python·vim·harmonyos·openharmony
雪度娃娃1 小时前
转向现代C++——优先选用别名声明,而非 typedef
开发语言·c++
沐知全栈开发1 小时前
PHP While 循环
开发语言
Data_Journal2 小时前
什么是数据采购,它究竟如何运作?
大数据·开发语言·数据库·人工智能·python
之歆2 小时前
DAY_14JavaScript DOM 进阶:HTML DOM 接口、事件监听与经典交互实战
开发语言·前端·javascript·html·ecmascript·交互
笨蛋不要掉眼泪2 小时前
Java并发编程:深入理解ThreadLocal
java·开发语言·jvm·并发
番茄去哪了2 小时前
JVM虚拟机(中)
java·开发语言·jvm