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

    文章

    4331

    浏览量

    62604
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73642
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68600

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

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

收藏 人收藏

    评论

    相关推荐

    同样是函数,在CC++中有什么区别

    同样是函数,在 CC++ 中有什么区别? 第一个返回值。 C语言的函数可以不写返回值类型,编译器会默认为返回 int。 但是
    的头像 发表于 11-29 10:25 306次阅读

    基于OpenHarmony标准系统的C++公共基础库案例:SafeBlockQueue

    1、程序简介该程序是基于OpenHarmony的C++公共基础库的读写锁:SafeBlockQueue。线程安全阻塞队列SafeBlockQueue,提供阻塞和非阻塞版的入队入队和出队接口,并提
    的头像 发表于 08-30 12:41 309次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础<b class='flag-5'>类</b>库案例:SafeBlockQueue

    美光斥资18.1亿收购达厂房,布局前段晶圆测试

    近日,半导体行业迎来重大交易,显示面板巨头达光电宣布了一项重要资产出售计划。达不仅出售了其位于台南的厂房不动产,还通过子公司达晶材转让了台中的厂房资产,两笔交易的接盘方均为中国台湾内存大厂美光。据悉,此次交易总额高达新台币
    的头像 发表于 08-29 15:47 394次阅读

    鸿蒙原生应用服务开发-初识仓颉开发语言

    、提升开发效率,例如插值字符串、主构造函数、Flow 表达式、match、if-let、while-let 和重导出等语法,让开发者可以用较少编码表达相关逻辑。 多范式编程 :仓颉编程语言支持函数式、命令
    发表于 08-15 10:00

    OpenHarmony标准系统C++公共基础库案例:HelloWorld

    1、程序简介该程序是基于凌蒙派OpenHarmony-v3.2.1标准系统C++公共基础库的简单案例:HelloWorld。主要讲解C++公共基础库案例如何搭建和编译。2、程序解析
    的头像 发表于 08-13 08:23 520次阅读
    OpenHarmony标准系统<b class='flag-5'>C++</b>公共基础<b class='flag-5'>类</b>库案例:HelloWorld

    鸿蒙原生应用服务开发-初识仓颉开发语言

    、提升开发效率,例如插值字符串、主构造函数、Flow 表达式、match、if-let、while-let 和重导出等语法,让开发者可以用较少编码表达相关逻辑。 多范式编程 :仓颉编程语言支持函数式、命令
    发表于 07-30 17:49

    面板双雄达、群创股东会将举行,达发红利,群创减资

    达暂无盈余分配计划,但将运用资本公积金每股发放0.9新台币的现金,而群创则有现金减资议案,拟注销108.94亿人民币,预计减资比例约为12%,每股返还股款约1.2
    的头像 发表于 05-27 10:06 371次阅读

    数峦云与三科技达成战略合作,共建有色金属工业宇宙

    近日,数峦云科技与三科技(股票代码834475)达成战略合作,双方将围绕有色金属智能制造展开深度合作,携手步入工业制造智能化新时代。
    的头像 发表于 05-21 17:38 507次阅读
    数峦云与三<b class='flag-5'>友</b>科技达成战略合作,共建有色金属工业<b class='flag-5'>元</b>宇宙

    合纵科技转让雅新材料55%股权

    合纵科技的控股公司湖南雅城新能源股份有限公司(简称“湖南雅城”)在5月15日公告称,拟以1.3亿人民币的对价将其持有的贵州雅新材料有限公司(简称“贵州雅”)55%的股权转让给浙江
    的头像 发表于 05-19 10:44 926次阅读
    合纵科技转让雅<b class='flag-5'>友</b>新材料55%股权

    2亿多!科半导体斩获欧洲SiC长订单

    近日,科半导体在国际竞争激烈的SiC衬底市场杀出一条血路,成功拿下超2亿的出口欧洲长订单之后,顺利通过“国际汽车特别工作组质量管理体系”(IATF16949)认证,获得进军国内新能源汽车芯片衬底百亿级规模市场“通行证”。
    的头像 发表于 03-21 17:20 717次阅读

    润和软件与兰科技签订战略合作协议

    江苏润和软件股份有限公司(以下简称“润和软件”)与北京兰科技有限公司(以下简称“兰科技”)宣布达成战略合作,双方正式签约,携手成为紧密的战略级合作伙伴。此次合作,双方将共同聚焦土壤智能监测领域的创新发展,深入挖掘合作潜力,共同开拓广阔市场。
    的头像 发表于 03-21 10:28 546次阅读

    思特伙伴IDS来访!

    2024年3月11日至13日, 思特深度战略合作伙伴IDS团队 来访虹科广州总部,与思特团队围绕 客户项目、市场推广、技术交流 等方面的工作展开了深入沟通,双方针对未来合作共同进行了蓝图规划
    的头像 发表于 03-19 16:57 469次阅读
    <b class='flag-5'>友</b>思特伙伴IDS来访!

    国内矿山无人驾驶公司易控智驾获得3亿C++轮融资

    近日,国内矿山无人驾驶公司易控智驾获得3亿C++轮融资,本轮由老股东兴杭国投和紫金矿业领投,郑州人才基金跟投。
    的头像 发表于 03-13 11:40 817次阅读

    c语言,c++,java,python区别

    操作系统、嵌入式系统等对性能要求较高的场景。C语言的语法相对简单,学习曲线较平缓,也是学习其他高级语言的入门语言。 C++C++是在C
    的头像 发表于 02-05 14:11 2388次阅读

    vb语言和c++语言的区别

    Microsoft开发的一种面向对象的事件驱动编程语言。它的设计目标是简化编程过程,让初学者也能快速上手。与之相比,C++语言是一种通用的、面向对象的编程语言,其设计目标是提供高性能的系统级编程。 语法: VB语言的语法较为简单
    的头像 发表于 02-01 10:20 2311次阅读