0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

C语言编程学习基地 来源: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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67819
  • C++
    C++
    +关注

    关注

    22

    文章

    2124

    浏览量

    77353
  • 代码
    +关注

    关注

    30

    文章

    4975

    浏览量

    74349

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    岚图汽车高层一行莅临联科技座谈交流

    1月21日上午,岚图汽车总经理蒋焘、智能电子电气总监陈晴、数字化电器采购总监李强、综合采购总监汪豫一行莅临联科技。联科技总经理高亮、党委书记兼常务副总经理夏鹏涛、副总经理陈锣、总经理助理兼联智连总经理文军红、总经理助理唐有
    的头像 发表于 01-24 14:53 1075次阅读

    服务交易评价

    功能简介 服务交易评价是服务平台官方提供的,反映用户对服务交易体验的评价系统。在服务中产生交易的用户,可以针对本元服务的交易体验进行打分、发表评论。 真实的评价内容可以帮助用户
    发表于 12-29 10:35

    C语言与C++的区别及联系

    并没有错。 C++一开始被本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)发明时,起初被称为“C with Classes”,即「带C」。 很明显,它是在
    发表于 12-24 07:23

    CC++之间的联系

    1、语法兼容性: C++完全兼容C语言的语法,这意味着任何有效的C语言程序都可以直接在C++
    发表于 12-11 06:51

    C语言和C++之间的区别是什么

    区别 1、面向对象编程 (OOP): C语言是一种面向过程的语言,它强调的是通过函数将任务分解为一系列步骤进行执行。 C++C语言的基础上扩展了面向对象的特性,支持
    发表于 12-11 06:23

    发布服务配置隐私声明

    服务必须先使用AGC的隐私声明托管服务生成自己的隐私声明,才能在版本信息页面选择到。详细内容参见配置隐私声明(服务)和配置用户协议。 登录AppGallery Connect,点击“APP与
    发表于 11-25 11:24

    发布服务配置内容分级

    ”。 8.如果您最终选择的年龄分级为3、8或者12,点击“提交”后,您还需再次确认您的服务是否仅面向儿童。 选择“是”:如果服务分类是儿童,点击“确认”成功提交分级;如果服务
    发表于 11-21 11:29

    发布服务配置应用内资费类型和应用内商品

    一、设置应用内资费类型,用于标识用户使用服务时需要付费的类型。基于业务场景,支持选择多个类型。 应用内资费类型包括: 激活收费 道具收费 关卡收费 购买虚拟币 部分章节收费(图书阅读)课程收费
    发表于 11-19 10:18

    思特新闻 | 携手共进,智见未来,思特荣获IDS环亚太地区年度最佳合作伙伴奖

    在iDS 2025 APAC SUMMIT上,思特凭借卓越的合作表现与市场贡献,荣获 “环亚太地区年度最佳合作伙伴奖”。这一荣誉不仅是IDS对思特长期合作的认可,也彰显了我们在推动机器视觉技术应用方面的领先实力。
    的头像 发表于 11-07 11:30 1032次阅读
    <b class='flag-5'>友</b>思特新闻 | 携手共进,智见未来,<b class='flag-5'>友</b>思特荣获IDS环亚太地区年度最佳合作伙伴奖

    服务配置支持设备

    发布时,您可以为服务配置分发至多种设备,默认发布设备为您创建元服务用时选择的设备类型,您可以根据实际情况进行修改。您只需发布一次,用户即可在多种设备上使用您的服务。 登录AppGallery
    发表于 10-22 16:54

    服务上架自检

    为提高服务审核通过率,建议您使用上架自检功能。该功能使用热门移动终端设备,按照华为应用市场上架标准对服务进行兼容性、稳定性、性能、功耗、UX、隐私等测试,可帮助您提前发现和解决问题。 登录
    发表于 10-21 17:18

    瑞丰光电斩获达2025年度共创合作伙伴奖

    近日,达2025全球供应商大会召开,以“链结力 共创无限”为主题,汇集来自北美、欧洲、亚太等地区超300位供应链伙伴。
    的头像 发表于 09-22 15:01 990次阅读

    时识科技亮相中科院半导体所首届所产学研研讨会

    近日,时识科技(SynSense)创始人兼CEO乔宁博士作为知名所,荣幸受邀回到母校中国科学院半导体研究所,参与其建所65周年庆典暨首届所产学研研讨会。
    的头像 发表于 09-17 16:40 1265次阅读

    晶DE1-SOC开发板实现Chirikov标准映射求解器

    该项目是在晶DE1-SOC开发板实现Chirikov标准映射的求解器,并将其应用于图像加密和解密的概念验证。
    的头像 发表于 07-07 15:22 1991次阅读
    在<b class='flag-5'>友</b>晶DE1-SOC开发板实现Chirikov标准映射求解器

    基于LockAI视觉识别模块:C++目标检测

    本文档基于瑞芯微RV1106的LockAI凌智视觉识别模块,通过C++语言做的目标检测实验。本文档展示了如何使用lockzhiner_vision_module::PaddleDet进行目标检测,并通过lockzhiner_vision_module::Visualiz
    的头像 发表于 06-06 13:56 1002次阅读
    基于LockAI视觉识别模块:<b class='flag-5'>C++</b>目标检测