C++入门基础

目录

 命名空间

命名空间定义

命名空间中可以定义变量/函数/类型

命名空间可以嵌套定义

命名空间的使用方式

1.把整个命名空间展开

 2.使用using将命名空间中某个成员引入

 3.加命名空间名称及作用域限定符

缺省参数

缺省参数分类

函数重载

参数类型不同

 参数个数不同

 参数顺序不同

 不能构成函数重载的情况

 构成重载,但是会出现问题的情况

 C语言不支持重载的原因

 C++支持函数重载的原因

引用

引用格式

 引用特性

 引用的应用

引用做参数

引用做返回值

 引用做返回值的错误示例

 引用总结

extern "c"

内联函数

内联函数的特性

auto关键字

auto的用法

 auto不能推导的场景

1.auto不能作为函数的参数

 2.auto不能直接用来声明数组

基于范围的for循环

范围for的语法

指针空值nullptr


 命名空间

C/C++ 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化 ,以避免命名冲突或名字污染 namespace 关键字的出现就是针对这种问题的。

命名空间定义

定义命名空间,需要使用到 namespace 关键字 ,后面跟 命名空间的名字 ,然 后接一对 {} 即可, {} 中即为命名空间的成员。

  • 命名空间中定义的是一个全局变量
  • :: 叫做域作用限定符,就是配合命名空间一起使用的

命名空间中可以定义变量/函数/类型

命名空间可以嵌套定义

 注意:同一个工程允许存在多个同名的命名空间,编译器最后会合成为同一个命名空间

命名空间的使用方式

1.把整个命名空间展开

优点:使用方便

缺点:隔离失效

下面这段代码中rand就出现了问题,因为命名空间全部展开了,这里不知道是调的头文件中包含的rand还是N2中包含的rand.

 2.使用using将命名空间中某个成员引入

这个方法可以用于展开一些命名空间中常用的部分

 3.加命名空间名称及作用域限定符

 

缺省参数

缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。

缺省参数分类

  • 全缺省参数(函数的每个参数都有缺省值)

  • 半缺省参数(函数参数部分有缺省值)

 注意:

1.半缺省参数必须从右往左依次给出,不能间隔着给

2.缺省参数不能在函数声明和定义中同时出现

3.缺省值必须时常量或者全局变量


函数重载

函数重载: 是函数的一种特殊情况, C++ 允许在 同一作用域中 声明几个功能类似 的同名函数 ,这 些同名函数的形参列表 ( 参数个数 或 类型 或 类型顺序 ) 不同 ,常用来处理实现功能类似数据类型 不同的问题。

参数类型不同

 参数个数不同

 参数顺序不同

 不能构成函数重载的情况

函数参数类型相同无法区分函数,返回值不是判断函数重载的标志

主要看函数的参数

下面主要是因为参数相同才不能构成函数重载

 注意:缺省值不同,不能构成重载

 构成重载,但是会出现问题的情况

 C语言不支持重载的原因

 C++支持函数重载的原因


引用

引用 不是新定义一个变量,而 是给已存在变量取了一个别名 ,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。

引用格式

类型+&+引用变量名(对象名)=引用实体

 注意:

            看下面的代码引用在语法层,我们要理解这里没有开辟新空间

            就是对原来的取了一个新名称叫做b

 引用特性

引用在定义时必须初始化

一个变量可以有多个引用

引用一旦引用一个实体,再不能引用其他实体

 引用的应用

引用做参数

引用做返回值

 引用做返回值的错误示例

 引用总结

引用的作用主要体现在传参和传返回值

1.引用传参和传返回值,有些场景下面,可以提高性能。

2.引用传参和传返回值,输出型参数和输出型返回值。通俗点说,有些场景下面,形参的改变可以改变实参。有些场景下面,引用返回,可以改变返回对象。


extern "c"

有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern “C”,意思是告诉编译器,将该函数按照C语言规则来编译。比如:tcmalloc是google用C++实现的一个项目,他提供tcmallc()和tcfree两个接口来使用,但如果是C项目就没办法使用,那么他就使用extern “C”来解决


内联函数

内联函数的特性

1. inline 是一种 以空间换时间 的做法,如果编译器将函数当成内联函数处理,在 编译阶段,会
用函数体替换函数调用 ,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
行效率。
2. inline 对于编译器而言只是一个建议,不同编译器关于 inline 实现机制可能不同 ,一般建
议:将 函数规模较小 ( 即函数不是很长,具体没有准确的说法,取决于编译器内部实现 )
是递归、且频繁调用 的函数采用 inline 修饰,否则编译器会忽略 inline 特性。
3. inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开,就没有函数地址
了,链接就会找不到。

注意:inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到


auto关键字

在早期 C/C++ auto 的含义是:使用 auto 修饰的变量,是具有自动存储器的局部变量 ,但遗憾的 是一直没有人去使用它,大家可思考下为什么? C++11中,标准委员会赋予了 auto 全新的含义即: auto 不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器, auto 声明的变量必须由编译器在编译时期推导而得

auto的用法

随着出现越来越复杂,程序中用到的类型也越来越复杂,经常体现在:

1.类型难于拼写

2.含义不明确导致容易写错

当类型复杂时我们就可以用到auto

 auto不能推导的场景

1.auto不能作为函数的参数

 2.auto不能直接用来声明数组


基于范围的for循环

范围for的语法

对于一个 有范围的集合 而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因 此C++11 中引入了基于范围的 for 循环。 for 循环后的括号由冒号 分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围


指针空值nullptr

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:

 NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码

 可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

注意:

1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。

2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值