C++友元&&命名空间&&数据类型&&内联&&重载&&缺省

1.友元

(1)全局函数作为友元

利用友元这个语法,我们可在函数里访问类里面定义的私有成员;

先定义了一个默认构造函数对类里面的成员进行初始化;goodgay是一个全局的函数,我们想要直接打印私有成员变量就会报错,我们只需要把这个全局函数的定义的第一行放到类里面去,在前面加上friend关键字就可以访问类里面的私有的成员变量bedroom了;

(2)类作友元

上面的这段代码比较长,可能比较复杂,但是并不是很难理解,我们首先从main函数开始阅读,调用了test01函数,这个函数会使用我们的goodgay实例化一个对象gg,我们让这个对象调用函数visit;我们使用goodgay实例化对象首先就要调用它的默认的构造函数,这个函数里面我们在堆区为我们创建的building1指针开辟空间;

visit函数想要访问building类里面的成员,我们是可以访问他的公共的成员的,但是我们不能访问私有的成员,我们只有在buiding这个类定义里面添加frieng class goodgay这句话,我们才可以在visit函数里面访问building类里面的私有的成员;

其实仔细观察我们就可以发现,我们在goodgay这个类里面定义了building类型的指针,这个时候就已经是在一个类里面使用另外的一个类进行定义了,所以我们的goodgay里面的函数visit可以访问building类里面的公共成员;另外,我们需要注意的就是我们这个是在类的外面去写对应的构造函数,我们在累的里面必须要进行相应的声明,而且在类的外面,我们需要先使用类名加上两个冒号指明接下来要写的函数是属于哪个类的;

(3)成员函数作友元

成员函数就是类里面的函数,这个函数要想成为友元,做法基本上是和我们的第一个的全局函数的操作方法基本是一样的,不同点就在于我们的成员函数是在一个指定的类里面的,我们需要标明函数的作用域,也就是函数的前面要加上类的名字和两个冒号;

2.命名空间

(1)上面的就是命名空间的一种定义的方法,我们使用namespace加上空间的名字来定义我们的命名空间,上面就是我们自己进行定义的两个命名空间,命名空间的存在的意义就是可以增加标识符的使用率,减少编程的过程中因为命名冲突而产生的影响,我们的命名空间里面定义的变量和函数就属于这个命名空间;

(2)命名空间只能够在全局区域里面进行使用,不能在主函数里面使用,我们在主函数里面初始化命名空间里面的变量和函数的调用的时候,都要注明对应的命名空间,这个时候就要使用的是::他的名字叫做作用域分辨符;我们使用这个符号就可以进行相应的函数的调用和变量的初始化

(3)我们如果感觉每次都这样做很麻烦,我们可以先使用using namespace说明对应的命名空间,这样就可以省略对应的作用域了,我们需要注意的就是当多次进行省略的时候,我们需要防止产生二义性,就是像我们这个图片里面的报错一样,我们的两个命名空间里面的变量和函数都是一样的,这个时候编译器就无法知道我们想要调用哪个,因此我们需要注意这种情况,但是如果我们使用命名空间::作用域分辨符::变量这种写法,就一定不会出错;

(4)作用域分辨符还有一个用法就是之前我们了解到的面对局部变量和全局变量相同时,会优先打印的是局部变量,我们使用预作用分辨符就可以打印全局变量,示例如下:效果显而易见

3.C++里面新的数据类型

(1)指针&&布尔类型

原来我们学习的C语言里面的空指针是NULL,在C++里面,我们使用nullptr代表空指针;

bool类型我们之前也接触过,num我们赋值的是大写的字母A,只要不是0就表示的是真的,我们打印输出这个布尔类型的数据,打印的结果就是1(实际上布尔类型的数据的打印的结果只能是0或者1),我们使用sizeof计算大小,布尔类型的数据只会占一个字节,大大的节省了我们的内存空间

(2)引用类型

引用可以作为函数的参数

引用就是取别名,这个别名的符号和我们的取地址的符号是完全一样的,但是我们不要往取地址上面去想,我们就理解为取别名就可以了;

这段代码是先让指针p指向的是num=10;然后改变指针的指向,我们的函数传递的是p指针,我们是使用&temp来进行接受的,这个里面两者的数据类型要相互匹配,同样是int*类型,后面加上&表示这个temp是一个引用的类型,实际上temp就是p指针的别名;我们修改temp的指向相当于修改的是p指针的指向,我们让temp指针指向ret这个全局变量,相当于是p指针指向了这个全局变量,当我们的函数调用完成的时候,我们对p指针姐应用,就得到的是全局变量ret的值100;

引用可以作为返回值

我们的自定义函数print返回的是一个全局变量,不能返回一个局部的变量,因为局部变量的空间可能会被释放掉,我们的引用作为返回值相当于是返回了一个变量,因此我们可以放在等式的左边,但是普通的不带引用的函数的返回值解释一个数值,如果放在等式的左边就会报错,因为左边是必须可以修改的才行;

下面的是右值引用(理解即可):

右值引用的要求是必须传递常量,而且主函数里面给函数传递的实参必须是常量,不能是变量,我们的函数里面,可以对形参的值进行改变。

4.内联函数

内联函数是指使用inline修饰的函数,这个函数变成内联函数之后,就可以提高程序的运行的效率

(1)内联函数是以以空间换时间;

(2)短小精悍的函数才可以成为内联函数,因为这个函数一旦成为内联函数之后,就会以二进制代码的方式存储在内存里面,如果我们的函数的代码很长,就会导致这个转化之后的二进制的代码量非常大,这个就无法凸显其作为内联函数的优势了;

(3)我们在结构体里面定义的函数和类里面定义的函数默认为内联函数;

比如说我们在写OJ的时候,出现程序的运行时间过长,如果符合内联函数的使用条件,我们就可以把这个函数转换为内联函数,这样就可以提高程序的运行效率,具体是提高了多少,我们使无从得知的;

5.函数重载

允许同名但是不同参数的函数存在:参数不同可以是参数的个数不同,参数的顺序不同,参数的数目不同;

根据我们的主函数里面的传参,编译器会自动识别参数类型,自动匹配相对应的函数;

6.函数缺省

必须从右边向左边进行缺省:

如果我们调用的时候,给了参数,计算的时候就会使用我们传递过去的参数,如果没有给定参数,编译器就会使用默认的参数。当两者同时存在的时候,我们自己传递过去的值的优先级高于默认值

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值