侵权投诉

C++基础语法友元类和友元函数

C语言编程学习基地 2021-09-12 09:52 次阅读

本期是C++++基础语法分享的第五节,今天给大家来分享一下:

(1)explicit(显式)关键字;

(2)friend 友元类和友元函数;

(3)using;

(4):: 范围解析运算符;

(5)enum 枚举类型;

(6)decltype;

那么我们接下来一起来看看吧!

explicit(显式)关键字

explicit 修饰构造函数时,可以防止隐式转换和复制初始化

explicit 修饰转换函数时,可以防止隐式转换,但 按语境转换 除外

explicit 使用

struct A{ A(int) { } operator bool() const { return true; }};

struct B{ explicit B(int) {} explicit operator bool() const { return true; }};

void doA(A a) {}

void doB(B b) {}

int main(){ A a1(1); // OK:直接初始化 A a2 = 1; // OK:复制初始化 A a3{ 1 }; // OK:直接列表初始化 A a4 = { 1 }; // OK:复制列表初始化 A a5 = (A)1; // OK:允许 static_cast 的显式转换 doA(1); // OK:允许从 int 到 A 的隐式转换 if (a1); // OK:使用转换函数 A::operator bool() 的从 A 到 bool 的隐式转换 bool a6(a1); // OK:使用转换函数 A::operator bool() 的从 A 到 bool 的隐式转换 bool a7 = a1; // OK:使用转换函数 A::operator bool() 的从 A 到 bool 的隐式转换 bool a8 = static_cast《bool》(a1); // OK :static_cast 进行直接初始化

B b1(1); // OK:直接初始化 B b2 = 1; // 错误:被 explicit 修饰构造函数的对象不可以复制初始化 B b3{ 1 }; // OK:直接列表初始化 B b4 = { 1 }; // 错误:被 explicit 修饰构造函数的对象不可以复制列表初始化 B b5 = (B)1; // OK:允许 static_cast 的显式转换 doB(1); // 错误:被 explicit 修饰构造函数的对象不可以从 int 到 B 的隐式转换 if (b1); // OK:被 explicit 修饰转换函数 B::operator bool() 的对象可以从 B 到 bool 的按语境转换 bool b6(b1); // OK:被 explicit 修饰转换函数 B::operator bool() 的对象可以从 B 到 bool 的按语境转换 bool b7 = b1; // 错误:被 explicit 修饰转换函数 B::operator bool() 的对象不可以隐式转换 bool b8 = static_cast《bool》(b1); // OK:static_cast 进行直接初始化

return 0;}

friend 友元类和友元函数

能访问私有成员

破坏封装性

友元关系不可传递

友元关系的单向性

友元声明的形式及数量不受限制

using

using 声明

一条 using 声明 语句一次只引入命名空间的一个成员。它使得我们可以清楚知道程序中所引用的到底是哪个名字。如:

using namespace_name::name;

构造函数的 using 声明

在 C++11 中,派生类能够重用其直接基类定义的构造函数。

class Derived : Base {public: using Base::Base; /* 。.. */};

如上 using 声明,对于基类的每个构造函数,编译器都生成一个与之对应(形参列表完全相同)的派生类构造函数。生成如下类型构造函数:

Derived(parms) : Base(args) { }

using 指示

using 指示 使得某个特定命名空间中所有名字都可见,这样我们就无需再为它们添加任何前缀限定符了。如:

using namespace_name name;

尽量少使用 using 指示 污染命名空间

一般说来,使用 using 命令比使用 using 编译命令更安全,这是由于它只导入了指定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译命令导入所有的名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。

using 使用

尽量少使用 using 指示

using namespace std;

应该多使用 using 声明

int x;std::cin 》》 x ;std::cout 《《 x 《《 std::endl;

或者

using std::cin;using std::cout;using std::endl;int x;cin 》》 x;cout 《《 x 《《 endl;

:: 范围解析运算符

分类

全局作用域符(::name):用于类型名称(类、类成员、成员函数、变量等)前,表示作用域为全局命名空间

类作用域符(class::name):用于表示指定类型的作用域范围是具体某个类的

命名空间作用域符(namespace::name):用于表示指定类型的作用域范围是具体某个命名空间的

:: 使用

int count = 11; // 全局(::)的 count

class A {public: static int count; // 类 A 的 count(A::count)};int A::count = 21;

void fun(){ int count = 31; // 初始化局部的 count 为 31 count = 32; // 设置局部的 count 的值为 32}

int main() { ::count = 12; // 测试 1:设置全局的 count 的值为 12

A::count = 22; // 测试 2:设置类 A 的 count 为 22

fun(); // 测试 3

return 0;}

enum 枚举类型

限定作用域的枚举类型

enum class open_modes { input, output, append };

不限定作用域的枚举类型

enum color { red, yellow, green };enum { floatPrec = 6, doublePrec = 10 };

decltype

decltype 关键字用于检查实体的声明类型或表达式的类型及值分类。语法:

decltype ( expression )

decltype 使用

// 尾置返回允许我们在参数列表之后声明返回类型template 《typename It》auto fcn(It beg, It end) -》 decltype(*beg){ // 处理序列 return *beg; // 返回序列中一个元素的引用}// 为了使用模板参数成员,必须用 typenametemplate 《typename It》auto fcn2(It beg, It end) -》 typename remove_reference《decltype(*beg)》::type{ // 处理序列 return *beg; // 返回序列中一个元素的拷贝}

责任编辑:haq

原文标题:C++基础语法梳理:友元类和友元函数以及using用法

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

深入探讨 Hilt的工作原理

所涉主题      多种 Hilt 注解协同工作并生成代码的方式。 当 Hilt 配合 Gradle....
的头像 谷歌开发者 发表于 10-19 15:11 55次 阅读
深入探讨 Hilt的工作原理

一文了解Cortex-M中断向量表对齐原则

来源 | 痞子衡嵌入式 一、Cortex-M中断向量表对齐原则   中断向量表就是一个集中保存系统全....
的头像 strongerHuang 发表于 10-19 11:06 136次 阅读
一文了解Cortex-M中断向量表对齐原则

有什么方法可以实现时间戳转日期的算法呢

有什么方法可以实现时间戳转日期的算法呢?怎样去实现时间戳转日期的算法呢? ...
发表于 10-19 09:23 0次 阅读

STM32F407ZG串口配置有哪些步骤

STM32F407ZG串口操作相关库函数是什么? STM32F407ZG串口配置有哪些步骤?...
发表于 10-19 08:14 0次 阅读

中断优先级配置的函数有哪几种

中断优先级配置的函数有哪几种? 怎样去比较抢占优先级与响应优先级呢? ...
发表于 10-19 08:02 0次 阅读

在C函数中的传递参数过程是怎样实现的

在C函数中的传递参数过程是怎样实现的?求解...
发表于 10-19 06:25 0次 阅读

怎样通过循环次数计算延迟函数的延迟时间呢

单片机不同晶振怎么计算延迟时间?怎样通过循环次数计算延迟函数的延迟时间呢?有什么方法吗?...
发表于 10-19 06:08 0次 阅读

如何去实现STM23F4的FLASH读取

STM32F4XX的闪存擦除方式分为哪几种? 如何去实现STM23F4的FLASH读取? ...
发表于 10-18 15:06 101次 阅读

怎样使用STM32CubeMx生成FMC的初始化代码呢

W9825G6KH-6的原理是怎样的? 怎样使用STM32CubeMx生成FMC的初始化代码呢? ...
发表于 10-18 09:52 101次 阅读

怎样去编写STM32F407+ESP8266的开发代码

怎样去编写STM32F407+ESP8266的开发代码? STM32F407+ESP8266的硬件是怎样进行连接的? ...
发表于 10-18 09:17 0次 阅读

怎样将stm32rct6的串口例程移植到stm32f103c8t6上去呢

怎样将stm32rct6的串口例程移植到stm32f103c8t6上去呢?有哪些操作步骤?...
发表于 10-18 07:53 0次 阅读

怎样去开发一种基于STM32的贪吃蛇小游戏

怎样去开发一种基于STM32的贪吃蛇小游戏?
发表于 10-18 06:42 0次 阅读

关于Python18个你不知道的高效编程技巧

初识Python语言,觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编....
的头像 马哥Linux运维 发表于 10-15 11:23 208次 阅读

PCB的设计、打板和焊接

最近MicroPython在嵌入式系统领域受到大家的喜爱,攻城狮们都纷纷研究起来,就连我们Funpa....
的头像 电子森林 发表于 10-15 10:04 172次 阅读

能快速找到代码运行最慢部分的编程神器

天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高。 今天分....
的头像 Linux爱好者 发表于 10-13 16:40 114次 阅读

动态内存分配的注意事项及本质是什么

C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 234次 阅读
动态内存分配的注意事项及本质是什么

Halcon和Opencv这两大图像处理库哪个更好

转自 | 小白学视觉   OpenCV Halcon 开发语言 C++、C#(emgu)、Pytho....
的头像 新机器视觉 发表于 10-13 15:11 239次 阅读

ACL2021的跨视觉语言模态论文之跨视觉语言模态任务与方法

来自:复旦DISC 引言 本次分享我们将介绍三篇来自ACL2021的跨视觉语言模态的论文。这三篇文章....
的头像 深度学习自然语言处理 发表于 10-13 10:48 207次 阅读
ACL2021的跨视觉语言模态论文之跨视觉语言模态任务与方法

带大家详细认识一下固件是干什么的

现如今,软件和硬件之间的界限已经越来越模糊了,那么处于这个灰色地带的,就是固件。于是,这就分成了三类....
的头像 STM32嵌入式开发 发表于 10-13 10:28 232次 阅读
带大家详细认识一下固件是干什么的

一文详解虚函数及其相关知识点

本期是C++基础语法分享的第七节,今天给大家来分享一下: (1)虚析构函数; (2)纯虚函数; (3....
的头像 C语言编程学习基地 发表于 10-13 10:14 197次 阅读

用Python实现3D地图教程

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 172次 阅读
用Python实现3D地图教程

关于Python对交通路口的红绿灯进行颜色检测

转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 230次 阅读
关于Python对交通路口的红绿灯进行颜色检测

spring中声明式事务实现原理猜想

  @Transactional注解简介 @Transactional 是spring中声明式事务管....
的头像 Android编程精选 发表于 10-13 09:20 190次 阅读

xv6的文件系统是如何实现的

文件系统 本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部....
的头像 Linux阅码场 发表于 10-12 18:00 135次 阅读
 xv6的文件系统是如何实现的

Linux中匿名页的访问分析

Linux 中 有后备文件支持的页称为文件页,如属于进程的代码段、数据段的页,内存回收的时候这些页面....
的头像 Linux阅码场 发表于 10-12 17:52 155次 阅读

处理器中异常和中断解决

异常是能够引起程序流偏离正常流程的事件,当异常发生时,正在执行的程序就会被挂起,处理器转而执行一块与....
的头像 单片机匠人 发表于 10-12 17:14 278次 阅读

RUST的真实驱动案例

我们无法确定RUST在内核的最终趋势,有多少人愿意迁移,但是至少Linus愿意试水。 Wedson ....
的头像 Linux阅码场 发表于 10-12 15:59 91次 阅读
RUST的真实驱动案例

那些有着巨大影响力的代码盘点

2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah P....
的头像 strongerHuang 发表于 10-12 15:46 185次 阅读
那些有着巨大影响力的代码盘点

那些书本上都没有提到的C语言volatile用法

许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句....
的头像 STM32嵌入式开发 发表于 10-12 14:47 1011次 阅读
那些书本上都没有提到的C语言volatile用法

什么是MicroPython 它能做什么有什么局限

随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 225次 阅读

PO VO DTO转换神器的思路

当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思....
的头像 Linux爱好者 发表于 10-12 11:13 200次 阅读

如何在Colab中使用SQL

如今,编码测试在数据科学面试过程中几乎是标准的。 作为一名数据科学招聘经理,我发现一个20-30分钟....
的头像 智能感知与物联网技术研究所 发表于 10-12 09:39 175次 阅读
如何在Colab中使用SQL

命令行工具Kubectl的别样用法

  kubectl 是 K8s 官方附带的命令行工具,可以方便的操作 K8s 集群。这篇文章主要介绍....
的头像 马哥Linux运维 发表于 10-12 09:31 132次 阅读

C++中的背包问题说明和源码示例

  问题说明 有N件物品和一个容量为V的背包。 第i件物品的重量是w[i],价值是v[i]。 求解将....
的头像 C语言编程学习基地 发表于 10-12 09:27 144次 阅读

Python的时间处理模块中处理日期与时间的全面总结

Python的时间处理模块在日常的使用中用的较多,但是使用的时候基本上都是要查资料,还是有些麻烦的,....
的头像 马哥Linux运维 发表于 10-12 09:24 193次 阅读
Python的时间处理模块中处理日期与时间的全面总结

C语言中驱动法编程的代码案例

数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据....
的头像 硬件攻城狮 发表于 10-12 09:21 186次 阅读

一本教你怎么写出让同事无法维护的代码

‍对,你没看错,本文就是教你怎么写出让同事无法维护的代码。一、程序命名 容易输入的变量名 。比如:F....
的头像 Linux爱好者 发表于 10-11 15:45 179次 阅读

优秀的 Verilog/FPGA开源项目介绍(一)

优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信 今天开始会陆续介绍一些优秀的开源项....
的头像 OpenFPGA 发表于 10-11 15:31 259次 阅读
优秀的 Verilog/FPGA开源项目介绍(一)

探究关于数字电路的一些基础知识

1.常用门电路图 2.逻辑代数的基本定理----化简时比较好用 反演定理:对于任意一个逻辑式 Y,若....
的头像 FPGA设计论坛 发表于 10-11 15:04 246次 阅读
探究关于数字电路的一些基础知识

鸿蒙的网络管理功能你们知道有多厉害吗

  本示例演示了如何使用网络管理模块相关接口,演示了以下功能: 功能 1: 使用默认网络,打开连接,....
的头像 HarmonyOS技术社区 发表于 10-11 14:26 271次 阅读
鸿蒙的网络管理功能你们知道有多厉害吗

开发一个鸿蒙版仿苹果计算器教程.附代码

众所周知鸿蒙 JS 框架是非常轻量级的 MVVM 模式。通过使用和 Vue2 相似的属性劫持技术实现....
的头像 HarmonyOS技术社区 发表于 10-11 14:17 231次 阅读
开发一个鸿蒙版仿苹果计算器教程.附代码

Linux内核热补丁安全隐患的探索

Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在....
的头像 Linux阅码场 发表于 10-11 11:54 197次 阅读
Linux内核热补丁安全隐患的探索

SystemVerilog语言介绍汇总

作者:limanjihe  https://blog.csdn.net/limanjihe/arti....
的头像 FPGA之家 发表于 10-11 10:35 217次 阅读

剖析verilog2005的骚操作之对数函数

小技巧分享: verilog下取对数其实可用$clog2这个系统函数,和自己找代码里面写入funct....
的头像 玩儿转FPGA 发表于 10-09 15:29 204次 阅读
剖析verilog2005的骚操作之对数函数

Floyd如何求图的最短路径

前言 在 图论 中,在寻路最短路径中除了 Dijkstra 算法以外,还有 Floyd 算法也是非常....
的头像 算法与数据结构 发表于 10-09 14:38 137次 阅读
Floyd如何求图的最短路径

Python版test1实战说明

上一篇文章已经带着大家安装 DeepStream 的 Python 开发环境,并且执行最简单的 de....
的头像 NVIDIA英伟达企业解决方案 发表于 10-09 14:28 155次 阅读

C语言指针作为形参怎么改变其指向的地址

就是一个函数的输入参数是一个指针,该函数需要改变该指针指向的地址,如: 现在有一个全局数组b,现在需....
的头像 嵌入式ARM 发表于 10-09 11:54 2151次 阅读

教你们如何用 Python 快速制作海报级地图附代码

 1 简介 基于 Python 中诸如 matplotlib 等功能丰富、自由度极高的绘图库,我们可....
的头像 Linux爱好者 发表于 10-09 11:36 264次 阅读

如何用10行代码轻松在ZYNQ MP上实现图像识别

本文来自赛灵思高级产品应用工程师,张超。如今各种机器学习框架的普及使得个人搭建和训练一个机器学习模型....
的头像 XILINX开发者社区 发表于 10-09 10:47 1751次 阅读
如何用10行代码轻松在ZYNQ MP上实现图像识别

LMK04821芯片项目代码详解

大侠好,阿Q来也,今天是第二次和各位见面,请各位大侠多多关照。今天给各位大侠带来一篇项目开发经验分享....
的头像 FPGA技术江湖 发表于 10-08 17:51 294次 阅读
LMK04821芯片项目代码详解

如何用List组件减小JS运行内存

每种编程语言都有它的内存管理机制,不同设备上可用内存不同,分配给JS引擎可用的内存范围也不同。例如运....
的头像 HarmonyOS开发者 发表于 10-08 17:46 190次 阅读

C++中棋盘覆盖问题分析

棋盘覆盖问题 问题说明 在一个2^k * 2^k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该....
的头像 C语言编程学习基地 发表于 10-08 17:06 275次 阅读