首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

1.友元 (1)全局函数作为友元 利用友元这个语法,我们可在函数里访问类里面定义的私有成员; 先定义了一个默认构造函数对类里面的成员进行初始化;goodgay是一个全局的函数,我们想要直接打印私有成员变量就会报错...,我们在累的里面必须要进行相应的声明,而且在类的外面,我们需要先使用类名加上两个冒号指明接下来要写的函数是属于哪个类的; (3)成员函数作友元 成员函数就是类里面的函数,这个函数要想成为友元,做法基本上是和我们的第一个的全局函数的操作方法基本是一样的...加上空间的名字来定义我们的命名空间,上面就是我们自己进行定义的两个命名空间,命名空间的存在的意义就是可以增加标识符的使用率,减少编程的过程中因为命名冲突而产生的影响,我们的命名空间里面定义的变量和函数就属于这个命名空间...; (2)命名空间只能够在全局区域里面进行使用,不能在主函数里面使用,我们在主函数里面初始化命名空间里面的变量和函数的调用的时候,都要注明对应的命名空间,这个时候就要使用的是::他的名字叫做作用域分辨符...,我们需要防止产生二义性,就是像我们这个图片里面的报错一样,我们的两个命名空间里面的变量和函数都是一样的,这个时候编译器就无法知道我们想要调用哪个,因此我们需要注意这种情况,但是如果我们使用命名空间::

4610

【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

:在实际运用代码的过程中,可能存在局部变量之间命名冲突/库与局部变量命名之间相互冲突的情况,因而我们可以在局部域全局域之外设置一个区域:命名空间域。...程序在编译时的优先顺序:局部域->全局域->展开的命名空间域 三.函数重载 【函数重载】 是函数的一种特殊情况,C++允许在同一作用域中声名几个功能类似的同名函数显著特征:这些同名函数的形参列表...3.内联函数声明和定义必须要放在一起的原因 编译器一旦把某个函数作为内联函数处理,就会在其调用的位置展开,即该函数没有地址,源文件编译后不会形成符号表,没有链接冲突。...关键字 说明: 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数...需要自己写的情况: 有动态申请资源时,需要自己写析构函数释放空间。(防止内存泄漏) 不需要自己写的情况: 没有动态申请资源时,不需要自己写,系统会自动回收空间。

25210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++为什么有参数依赖查找(ADL)?

    在查找时,还存在一些特殊的规则,以下仅举两例:比如在查找域运算符::左边的名字时,会忽略函数、变量、枚举等,只有类型名称会被查找在类内部声明的友元函数,其名称查找规则与成员函数相同。...在类外部定义的友元函数,其查找规则与命名空间中的函数相同。限定名称查找限定名称查找用于处理在作用域解析操作符::右侧出现的名称。...查找合并:将普通未限定查找找到的声明集合与ADL找到的声明集合合并,并应用特殊规则,例如,通过ADL可见的关联类中的友元函数和函数模板,即使它们在普通查找中不可见。...为什么与 yyy.h 一起编译的时候,在没有include的情况下也会失败呢?...避免命名冲突:ADL通过在参数类型的命名空间中查找函数,减少了全局命名空间的污染,有助于避免命名冲突。

    12110

    【C++】类和对象核心总结

    namespace域: 命名空间域,这个域里面可以由程序猿来放一些可能与库中函数或关键字起冲突的东东,和类一样,我们也可以选择性的放开命名空间中的功能对外开放,通过利用三种使用命名空间域的方式。...有了上面知识的讲解,就好解决这个问题了,由于内联函数不建立栈帧,在编译阶段就被展开在相应的位置了,所以在二进制指令里面就没有建立函数栈帧的指令,自然就没有形参的概念,所以这种情况,this指针根本不存在...这种情况下继续依靠编译器默认生成的析构显然无法满足资源的清理工作,这时候就需要我们手动去将申请的空间还给操作系统。...2.将全局重载写成友元函数,下面会讲到友元函数。 4.2 流插入(>)运算符的重载 a....友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 2.友元类 友元类的所有成员函数都可以是另一个类的友元函数

    76230

    【C++指南】类和对象(九):内部类

    计算外部类对象的大小就不会将内部类的成员包括在内 简单来说内部类与外部类的关系就是:(划重点) 内部类是外部类的友元类,但外部类不是内部类的友元类,并且内部类受到外部类类域限制和访问限定符限制。...内部类与外部类的相互作用 1.内部类访问外部类的成员: 简单来说:内部类默认是外部类的友元类 内部类可以定义在外部类的public、protected、private中都是可以的。...外部类对内部类没有任何优越的访问权限。 内部类在定义它的外围类的作用域内是可见的,但在外围类外部是不可见的。...避免命名冲突:通过内部类,可以避免不同命名空间或类中的命名冲突。 访问权限控制:内部类可以更好地控制对特定成员或方法的访问权限。...结语 C++ 中的内部类提供了一种灵活的方式来封装和隐藏实现细节,使得代码更加模块化和易于管理。 通过内部类,可以更好地控制访问权限,避免命名冲突,并实现辅助类来支持外围类的功能。

    11610

    内联和嵌套命名空间

    代码中会定义很多的类名、函数名、模板名,甚至一些全局变量,如果不对这些名称加以规范,很容易造成名字的冲突,因为默认情况下这些名字都是全局名字,这种情况也称之为命名空间污染。...为了避免这个问题,C++标准引入了命名空间的概念,将不同模块的名字限定在各自模块的命名空间中,命名空间中的名字的作用域只在命名空间内有效,尽可能地避免名字的冲突。...foo函数,前面需要加上Lib_V1的前缀,而访问Lib_V2命名空间的foo函数则不需要。...当遗憾的是,在C++17中没有解决在嵌套命名空间中定义内联命名空间,也就是说在上面的嵌套命名空间中没法加入inline关键字,使得子命名空间成为内联的,直到C++20标准中完善了这个功能。...因此在C++20中,我们可以通过以下的方式来定义命名空间:namespace A::B::inline C { void foo() {}}// 它等同于如下定义:namespace A::B {

    17520

    【Example】C++ 虚基类与虚继承 (菱形继承问题)

    当一个类继承了两个来自同父类的子类后,会产生命名空间冲突及资源冗余。...因此,可以看出,实际上 Blu 类当中存在两个 Gem 成员变量,分别来自 Byte 和 Expert,使用 this 指针进行调用,会发生命名空间冲突错误,同时造成了资源的重复浪费。...这时,Base 便成了 Byte 和 Expert 的虚基类,达成了虚继承的方式,Base 类在最终的 Blu 类中只存在一个,所以不存在命名空间冲突及资源浪费。...同时,在虚继承机制当中,虚基类是由最终的派生类进行初始化的,本身达成了一种 “间接继承” 的关系。 也就意味着最终的派生类在构造函数初始化中,要在初始化表中调用虚基类的构造函数进行初始化。...、外部都可以访问 protected 保护成员: 基类、派生类、友元可以访问 private 私有成员 :基类、友元可以访问 继承方式 基类 public 成员 基类 protected 成员 基类 private

    1K30

    8.3 C++ 定义并使用类

    ,而析构函数则执行了两次,第一次释放后,第二次释放内存则出现冲突的情况....system("pause"); return 0;}接着看下面的深拷贝代码,我们通过自己开辟堆空间,然后自己在拷贝构造函数中拷贝数据,防止冲突,同样的代码经过简单的的修改,就可以避免拷贝是数据释放的冲突问题...: 如下定义空指针,并尝试使用空指针访问类,那么如果类中没有判断空指针的语句,则程序会崩溃....per2.showInfo(); system("pause"); return 0;}友元函数的定义: 将全局函数定义为友元函数,让外部函数,可以访问特定的类内部的私有数据....#include #include using namespace std;class Student{ // 定义友元函数 --> 让goodGay 可以访问我的私有属性

    23120

    友元

    友元函数 之前我们在Time类的示例中,我们重载乘法运算符的参数和其他参数不一样,因为有两种不同的类型,即Time和double类型,限制了调用的方式,我们成员函数调用的过程是b..opertaor*...解决办法是,让他不由对象调用,而由非成员函数调用,但是非成员函数又无法访问类对象内的数据。怎么办。。。...,即友元函数 创建友元函数 创建友元函数的第一步将原型放在类声明中,并且在声明前加上friend friend Time operator*(double,const Time&T); 首先他是一个非成员函数...T*n; } 这样该函数没有访问到数据,但是可以用我们之前的成员函数进行计算,我们这里替换了一下参数的顺序,也有和友元函数一样的作用(最好是友元 可以成为类的接口的一部分) 重载<<运算符 方式1:...比如在只声明B是A友元的情况下,B可以访问A的私有成员,但是A却不可以访问B的私有成员,即A不是B的友元。 (3)友元关系不能传递:如果B是A的友元,C是B的友元,则不能说明C是A的友元。

    15310

    类和对象下

    友元详解 在C++中,友元(friend)提供了一种突破类的访问限定符的机制,使得外部函数或其他类可以访问类的私有(private)和受保护的成员(protected)。...友元可以是友元函数或友元类,而这种友元关系是在类定义中通过关键字 friend 显式声明的。 4.1 友元的基本概念 友元函数:友元函数可以访问类的私有和受保护成员,但它并不是类的成员函数。...因此,友元不宜滥用,应该谨慎使用。 4.5 友元函数与类的实际应用 友元在某些情况下能提供方便,比如当需要两个类之间进行紧密合作时,使用友元可以简化代码,减少冗长的接口设计。...这种情况下,友元机制简化了类与类之间的合作,不必通过公共接口访问私有数据,减少了不必要的代码冗余。 总结 友元机制在C++中提供了一种打破类封装的方式,允许外部函数或类访问类的私有和受保护成员。...6.3.2 匿名对象避免对象命名 在某些情况下,我们不需要为对象命名,只是想要使用对象来执行一些操作,匿名对象可以帮助避免命名冲突或不必要的命名。

    8010

    【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的高级应用

    友元可以是友元函数或友元类,而这种友元关系是在类定义中通过关键字 friend 显式声明的。 4.1 友元的基本概念 友元函数:友元函数可以访问类的私有和受保护成员,但它并不是类的成员函数。...4.5 友元函数与类的实际应用 友元在某些情况下能提供方便,比如当需要两个类之间进行紧密合作时,使用友元可以简化代码,减少冗长的接口设计。...这种情况下,友元机制简化了类与类之间的合作,不必通过公共接口访问私有数据,减少了不必要的代码冗余。 总结 友元机制在C++中提供了一种打破类封装的方式,允许外部函数或类访问类的私有和受保护成员。...6.3.2 匿名对象避免对象命名 在某些情况下,我们不需要为对象命名,只是想要使用对象来执行一些操作,匿名对象可以帮助避免命名冲突或不必要的命名。...匿名对象避免了额外的命名和管理开销,在简化代码的同时提高了代码的简洁性和可读性。 写在最后 在本文中,我们详细探讨了C++中几个重要的概念:友元、内部类、以及匿名对象。

    19510

    C++初阶大全

    一.命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。...使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的,比如后面vestor和list等等的模拟实现。...,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 友元类 友元类的所有成员函数都可以是另一个类的友元函数...友元关系不能传递 如果B是A的友元,C是B的友元,则不能说明C时A的友元。...C.友元函数不具备this指针 D.正确,普通成员方法具有隐藏的this指针 十一.内存管理 函数参数使用的空间是在()中申请的,malloc或new是在()中申请空间的?

    5810

    C++初阶

    一.命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。...使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的,比如后面vestor和list等等的模拟实现。...,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 友元类 友元类的所有成员函数都可以是另一个类的友元函数...友元关系不能传递 如果B是A的友元,C是B的友元,则不能说明C时A的友元。...C.友元函数不具备this指针 D.正确,普通成员方法具有隐藏的this指针 十一.内存管理 函数参数使用的空间是在()中申请的,malloc或new是在()中申请空间的?

    10210

    类的进化史

    其次,如果引入两个库,它们都包含相同的函数名称,则会出现错误,因为它们共用同一个的命名空间,链接器会在主表查询,当发现两个定义不同的同名函数,必然会报错。...现在我们似乎已经很好的解决了命名空间这个问题,事实上,C++使用多个命名空间,这也是其具备很好扩展性的基础,想必大家对与std::不会感到陌生,这是标准C++库的命名空间,在不同命名空间使用相同的标识是不会发生冲突的...需要注意的一点是,不要在头文件中放使用指令,using namespace XXX,这样会破坏对指定命名空间的保护,因为头文件的引用通常在文件的最开始处,这样在整个文件中使用指令都会有效,这就意味着命名空间保护在使用该头文件的任何文件中消失...有时还有这样的需求,想要其它不属于当前结构的一个成员函数访问当前结构中的数据,那该怎么办呢?这时候需要用到“友元”的概念。...什么是“友元”呢,就是使用friend标志来声明一个外部的函数,以告知编译器“这是我这个类的朋友,他可以访问我所有成员的权限。”,这样这个友元便能访问其所有的成员和成员函数。

    82550

    闭关多日,整理一份C++中那些重要又容易忽视的细节

    注意:假设名空间和声明区域定义了相同的名称,试图使用声明将名空间的名称导入该声明区域,则两个名称会发生冲突,从而出错。...没用过,下次可以试试自己写一个名空间,如果是没有名字的名空间,那么只能在包含那个名空间的文件里面使用该名空间内部的内容,类似于,静态变量、函数的集合。...它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下: friend 类型 函数名(形式参数); 友元函数的声明可以放在类的私有部分...,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。...另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。 为了解决上述问题,提出一种使用友元的方案。

    59410

    C++初阶 入门

    使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。...我们的命名与前人在头文件中写的函数名字出现了冲突。...别慌,首先呢这一大串是对应函数的地址,而之所以是对应函数的地址是因为,我们创建命名空间就像是在自己家外建立了一块围墙 有人想进来找东西,那肯定得要有钥匙,而没钥匙自然只能去墙外面找。...而编译器在墙外找到了一个叫rand的函数,自然就把它用起来了。 那么我们要怎么才能进入到对应命名空间中取出对应的变量呢?...那么这个时候我们要回避命名冲突的问题,我们就可以使用嵌套命名空间的方式,是的,你没有听错,命名空间是可以嵌套的。

    10110

    C++基础知识精髓

    内联函数:在编译阶段函数代码替换函数名,在调用运行的时候就没有函数的压栈和出栈的操作,提高运行效率,是空间换时间。...友元 类具备封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。...另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。 为了解决上述问题,提出一种使用友元的方案。...2.只能出现在类定义内部,友元声明可以在类中的任何地方,一般放在类定义的开始或结尾。 3.友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。...4.类必须将重载函数集中每一个希望设为友元的函数都声明为友元。 5.友元关系不能继承,基类的友元对派生类的成员没有特殊的访问权限。如果基类被授予友元关系,则只有基类具有特殊的访问权限。

    2K50

    C++:类与对象(3)

    一、深入解析构造函数 如上图,在一般情况下,我们认为A类中的_a1和_a2只不过是声明,并没有开空间,而真正的空间开辟是在【定义】的时候,也就是我们根据这个类实例化出整个对象的时候。...老铁们可能会想到用在全局设置一个count变量,然后在每个类的构造函数里++一次 这是因为count和std命名空间里的count冲突了,因此有两个方法: 1、认怂,给count换个名字 2、对std部分展开...但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。 友元分为:友元函数和友元类 3.1 友元函数 之前博主在类与对象(2)在日期类的实现中用到过一次友元。...但是在类外定义的话没办法直接用类里面的私有成员,如果强行变成公有就破坏了封装性,所以这里会用到友元的知识,友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明...,但不是类的成员函数 2、友元函数不能用const修饰(没有this指针) 3、友元函数可以在类定义的任何地方声明,不受类访问限定符限制 4、一个函数可以是多个类的友元函数 5、友元函数的调用与普通函数的调用原理相同

    11210

    C++基础知识复习

    ---- namespace_命名空间 C++避免名字冲突——使用命名空间。 例如: 不同命名空间中的同一个变量,所对应的内容不同。...---- 全局函数做友元函数 一个类的成员函数作为另外一个类的友元函数 ---- C++开发中,能不用全局函数就不用全局函数。 尽可能的用类的概念来做。...---- 友元类、友元函数,使用friend关键字进行声明即可,与访问权限无关。...一般情况下,双目运算符,使用友元函数更直观。 例如: 100 + person 只能通过友元来实现。 person + 100友元函数和成员函数都可以实现。...注意: C++规定运算符重载的操作对象至少有一个不是标准类型,而是用户自定义的类型。 特殊情况: (1)= () [] -> 不能重载为类的友元函数。

    56310
    领券