C++基础(一)
1.不同版本的hello word!
还记得第一次写C语言的hello word吗
这是C++版的
C++ 诞生于c之后,c++兼容了c,我们重点了解c++中不同于c的部分
2.namespace和::域作用限定符以及using
定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间可以定义变量/函数/类型等。
2.1 namespacenamespace bit
{
//定义变量
int rand=10;//定义函数
int Add ( int a , int b )
{
return a +b ;
}//定义类型
struct Node
{
struct Node* next;
int val;
};}
2.2::调用域下面的变量/函数等
bit ::rand
namespace本质是定义了一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不存在冲突了C++中域有函数局部域,全局域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的声明周期,命名空间域和类域不影响变量声明周期。
验证答案
namespace只能定义在全局,当然他还可以嵌套定义
项目工程中多个文件中定义的同名namespace会认为是一个namespace,不会冲突
C++标准库都放在一个叫std(stdndard)的命名空间中
2.3using用于展开域一般日常练习中我们可以using namespace std,世纪项目开发中不建议using namespace
3.C++输入和输出
<iostream>是Input Output Stream 的缩写,是标准的输入,输出流库,定义了标准的输入,输出对象std::cin是ostream类的对象,他主要面向窄字符(narrow character (of type char))的标准输入流std::cout是ostream类的对象,它主要面向窄字符的标准输出流std::endl 是一个函数,流插入输出流,相当于插入一个换行字符加刷新缓冲区<<是流插入运算符,>>是流提取运算符(c语言中的左移右移操作符)使用C++输入输出更方便,不要像printf/scanf输入输出那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是痛过重载实现的),其实最重要的是C++的流能更好的支持只定义类型对象的输入和输出。
在c++中我们没有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream>间接包含了。vs编译器是这样的,但其他编译器会报错
4.缺省参数
缺省参数是声明或定义函数时为函数指定一个确实值,在调用该函数时,如果没有指定实参则采用改形式参数的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省必须从右往左依次连续缺省,不能间隔条约给缺省值函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值
5.重载
C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或则类型不同。这样C++函数调用就表现出了多态行为,使用更加灵活。C语言是不支持同一作用域中出现同名函数的。
注意:返回值不能作为判断是否重载的依据因为容易产生歧义,如下面的代码f()调用
6.引用
6.1引用介绍引用不是新定义一个变量,而是给已存在变量去了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间
类型&引用别名=引用对象;
值一样,地址也一样
只是取得“外号”罢了
传统的交换函数
现在只要传引用就能解决
注意: 引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时改变被引用对象引用传参跟指针传参功能类似,引用传参相对更加方便引用返回值的场景相对比较复杂引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引用跟其他语言的引用有很大差别,除了用法,最大的点,C++引用定义后不能改变指向,JAVA的引用可以改变指向 6.4 const 的引用 可以引用一个const对象,但是必须用const引用。const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能放大
不需要注意的是类似于int& rb=a*3; double d=12.34 ; int & rd=d;这样一些场景下a*3的值结果保存在一个临时对象中,int& rd=d 也是类似,在类型转换中会产生临时对象存储中间值,也就是说,rb和rd引用的都是临时对象,而C++规定的临时对象具有常性,所以在这里就触发了权限放大,必须要用常引用才可以
所谓临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象,C++把这个未命名对象叫做临时对象
注意:临时对象只有短暂的生命周期,但是被引用后,生命周期会延长直到引用对象销毁
6.5指针和引用的关系C++中指针和引用就像两个性格迥异的亲兄弟,指针是哥哥,引用是弟弟,在实践中他们相辅相成,功能具有重叠性,但是各有自己的特点,互相不可替代
语法概念上引用是一个变量的取别名不开空间,指针是存储一个变量的地址,要开空间引用在定义时引用一个对象后,就不能再引用其他对象;而指针可以不断得改变指向对象引用可以直接访问指向对象,指针需要解引用才能访问指向对象sizeof中含义不同,引用结果为引用类型大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位平台下是8字节)指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全一些
从汇编语言来看,引用本质就是指针
7.inline
用inline修饰的函数叫做内敛函数,编译时C++编译器会在调用的地方展开内联函数,这样调用内敛函数就需要建立栈帧了,提高效率看一下汇编语言 ,实现内敛了
inline对于编译器而言只是一个建议,也就是说,你加了inline编译器也可以选择在调用的地方不展示,不同的编译器关于inline什么情况展开各不相同,因为C++标准没有这个。inline适合用于频繁调用的短小函数,对于递归函数,代码相对较对一些的函数,加上inline也会被编译器忽略2 C语言实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错且不方便调试,C++设计了inline目的就是替代C的宏函数VS编译器debug版本下面默认是不展开inline的,这样方便调试,debug版本想展开需要设置一下这两个地方
inline不建议声明和定义分离到两个文件,分离会导致链接错误。因为inline被展开,就没有函数地址,连接时会出现报错
8.nullptr
NULL实际是一个宏,在传统的C头文件(stddef.h)中。C++中NULL可能被定义为字面常量0,或者C中被定义为无类型指针(void*)的常量,不论采取哪种定义。在使用指针时,都不可避免会遇到一些麻烦
C++11中引入nullptr,nullptr是一个特殊的关键字,nullptr是一种特殊类型的字面量,它可以转换成任意其他类型的指针类型。使用nullptr定义空指针可避免类型转换的问题,因为nullptr只能被隐式转换成指针类型,而不能被转换为整数类型
Ongwu博客 版权声明:以上内容未经允许不得转载!授权事宜或对内容有异议或投诉,请联系站长,将尽快回复您,谢谢合作!