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

允许C++类访问其他类的某个"内部"成员,但不是私有的?

这个问答内容涉及到C++的访问控制和类的设计。在C++中,类的成员可以被声明为public、private或protected,分别表示公共成员、私有成员和受保护成员。

对于这个问题,我们可以使用C++的友元函数来实现。友元函数是一种特殊的函数,可以访问类的私有成员,但不是该类的成员。

例如,假设我们有一个名为A的类,其中有一个名为func的私有成员函数,我们希望允许另一个名为B的类访问该函数。我们可以使用以下代码实现:

代码语言:c++
复制
class A {
private:
    void func() {
        // do something
    }

    friend class B;
};

class B {
public:
    void accessFunc() {
        A a;
        a.func();
    }
};

在上面的代码中,我们将B类声明为A类的友元类,这意味着B类的成员函数可以访问A类的私有成员。因此,在B类的accessFunc()函数中,我们可以创建一个A类的实例,并调用其私有成员函数func()。

需要注意的是,友元函数不是类的成员,也不是类的私有成员,因此它们不能访问类的私有成员变量。此外,友元函数不能被继承,因此子类不能访问父类的友元函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++继承特性详解

这里不可见是指基成员还是被继承到了派生对象中,但是语法上限制派生对象不管在里面还是外面 都不能去访问它。 2....基private成员在派生中是不能被访问,如果基成员不想在外直接被访问需要在 派生中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现。 3....基其他 成员在子类访问方式 == Min(成员在基访问限定符,继承方式),public > protected > private。 4....使用关键字class时默认继承方式是private,使用struct时默认继承方式是public,不过 最好显示写出继承方式 c++在刚创立继承时,为了多方面考虑就把所有的继承方式都组合了(...当然有,如下图: 派生默认成员函数: 之前在C++和对象中篇时,我讲过了6个默认成员函数: 1. 派生构造函数必须调用基构造函数初始化基那一部分成员

11010

C++】继承

前言 在很多程序中都存在着一些互相关联但是有细微差别的概念,比如,同一家服装店,不同衣服价格定价策略不同,比如有的原价销售,有的打折销售。有时当总价格达到某个量级就会经行减免。...基负责定义在层次关系中所有共同拥有的成员,而每个派生定义各自特有的成员。 2.2继承定义 定义格式  继承关系和访用限定符 继承基成员访问方式变化 总结: 1....这里 不可见是指基成员还是被继承到了派生对象中,但是语法上限制派生对象不管在里面还是外面 都不能去访问它 。 2....基 private 成员在派生中是不能被访问,如果基成员不想在外直接被访问需要在派生中能访问,就定义为protected 。 可以看出保护成员限定符是因继承才出现 。 3....优先使用对象组合,而不是继承 。 继承允许你根据基实现来定义派生实现。这种通过生成派生复用通常被称 为白箱复用(white-box reuse)。

9110

Java 内部意义及应用

此外,由于 MyInnerClass 作为一个内部类,它对于外部类 OuterClass 中部分成员也是可见并全部可见,不同类型内部类可见外部类成员不尽相同,例如我们静态内部类对于外部类以下成员时可见...实际上编译器在编译我们外部类时候,会扫描其内部是否还存在其他类型定义,如果有那么会「搜集」这些代码,并按照某种特殊名称规则单独编译这些。...由于静态内部内部只能访问外部内静态成员,而对于访问权限可见情况下,这两个本质上毫无关联,如果像我们此例中外部类属性 name 而言,它本身被修饰为 private,不可见于外部任何。...成员内部类与静态内部类最大不同点就在于,成员内部类高度依赖一个外围实例,并且不允许定义任何静态成员,而静态内部类与外围趋于独立。...如果方法是实例方法,那么方法内内部类可以访问外围任意成员,如果方法是静态方法,那么方法内部内部类只能访问外围静态成员

1K40

后台开发:核心技术与应用实践 -- C++

C++允许用同函数名定义多个函数,这些函数必须参数个数不同或类型不同,这就是函数重载。...private成员只限于成员访问,protected成员允许成员和派生成员访问,不允许任何成员访问,public成员允许成员任何成员访问。...同时,无论哪一种继承方式,在派生中是不能访问私有 成员,私有成员只能被本类成员函数所访问,毕竟派生与基不是同一个 构造派生对象时,必须对基数据成员、新增数据成员成员对象数据成员进行初始化...虚函数声明方式: virtual 返回类型 函数名(); 当把基某个成员函数声明为虚函数后,就允许在其派生中对该函数重新定义,赋予它新功能,且可以通过指向基指针指向同一族中不同类对象,从而调用其中同名函数...虚函数实现了同一族中不同类对象可以对同一函数调用作出不同响应动态多态性。 C++中规定,当某个成员函数被声明为虚函数后,其派生同名函数都自动成为虚函数。

1.3K10

C++进阶之路:探索访问限定符、封装与this指针奥秘(与对象_上篇)

C++ 中有三种访问限定符: public(公有): 成员内部和外部都可以被访问。 protected(保护): 成员内部和派生(子类)中可以被访问,但不能在外部直接访问。...private(私有): 成员只能在内部访问,不能在外部或派生中直接访问。...在C++语言中实现封装,可以通过将数据以及操作数据方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在外部直接被使用。...具体来说,某个A中某个成员M在以下情况下具有A作用域: 该成员(M)出现在该类某个成员函数中,并且该成员函数没有定义同名标识符。 该类(A)某个对象成员(M)表达式中。...第一个成员在与结构体偏移量为0地址处。 2. 其他成员变量要对齐到某个数字(对齐数)整数倍地址处。 注意:对齐数 = 编译器默认一个对齐数 与 该成员大小较小值。

9410

c++和对象(七)

在上面的代码示例中,Getn 函数是一个静态成员函数,它主要特点和用法包括: 范围内函数:静态成员函数属于整个,**而不是某个特定对象。...、private 访问限定符限制 2.友元 友元(Friend)在C++中是一个重要概念,它允许某些特定外部函数或访问另一个私有(private)或受保护(protected)成员 2.1...operator>>同理 友元函数可以直接访问私有成员,它是定义在外部普通函数,不属于任何需要在内部声明,声明时需要加friend关键字 class Date { friend...Time和Date,在Time中声明Date为其友元,那么可以在Date中直接访问Time私有成员变量,想在Time访问Date中私有的成员变量则不行 友元关系不能传递:如果...外部类对内部类没有任何优越访问权限 内部类就是外部类友元,参见友元定义,内部类可以通过外部类对象参数来访问外部类中所有成员

7020

C++和对象核心总结

C++中我们实现封装其实就是通过访问限定符,将对象内部实现细节隐藏起来,通过访问限定符将某些接口放开在外部进行使用。...1.在里面写一个共公有的函数,用于获取成员变量,然后在全局重载里面调用这个公有函数,以这样方式来访问到私有的成员变量。...,符号表存在意义其实就是为了让函数能够跨文件使用,使得各个文件不再是独立个体,联合成一个整体程序,现在你函数已经变为内部链接属性,不允许其他源文件使用,自然也就失去了进入符号表意义。...const成员函数内部是不可以调用其他非const成员函数,因为const成员函数内部允许任何成员进行修改,而调用非const成员函数,是有可能在const成员函数内部修改成员,所以这就导致了权限放大...静态成员即可用 名::静态成员 或者 对象.静态成员访问 静态成员为所有对象所共享,不属于某个具体对象,存放在静态区。

70330

剖析【C++】——和对象(下篇)——超详解——小白篇

简单理解:静态成员就像学校里公共设施,比如学校大门(静态成员变量)和学校公告栏(静态成员函数),它们是所有学生(对象)共享,而不是某个学生独有的。...全局函数不能直接访问私有成员,这时就需要友元函数来解决这个问题。 友元函数特点: 可以访问私有和保护成员,但不属于成员函数。 不能用 const 修饰。...例如,如果 A 是 B 友元,那么 B 可以访问 A 私有成员反过来 A 不能访问 B 私有成员。 友元关系不能传递。...注意事项: 内部类就像是外部类友元内部类可以通过外部类对象参数访问外部类所有成员。 外部类对内部类没有友元访问权限,不能访问内部私有成员。...3.总结 内部类 是独立,可以定义在外部类任何访问区域。 内部类可以直接访问外部类静态成员,不需要外部类对象或名。 内部类可以通过外部类对象参数访问外部类非静态成员

5410

第 19 章 特殊工具与技术

当我们想使用基对象指针或引用执行某个派生操作,并且该操作不是虚函数时,上面两个运算符,就可以发挥作用。...*pdata; s = pScreen->*pdata; 因为数据成员一般情况下是私有的,不能直接获得数据成员指针。可以在内部定义一个成员函数,另其返回值是指向该成员指针。...含有构造函数或析构函数类型,也可以作为 union成员类型。 union可以为其成员指定 public、proteced和 private等保护标记,默认情况下,其成员都是公有的。...---- 19.7 局部类 局部类是指定义在某个函数内部,局部类定义类型只在定义它作用域内可见。 局部类所有成员(包括函数在内),都必须完整定义在内部。...在局部类中也不允许声明静态数据成员,因为没法定义这样成员。 外层函数对局部类私有成员没有任何访问特权。 局部类只能访问外层作用域定义类型名、静态变量以及枚举成员

80750

第 19 章 特殊工具与技术

当我们想使用基对象指针或引用执行某个派生操作,并且该操作不是虚函数时,上面两个运算符,就可以发挥作用。...*pdata; s = pScreen->*pdata; 因为数据成员一般情况下是私有的,不能直接获得数据成员指针。可以在内部定义一个成员函数,另其返回值是指向该成员指针。...含有构造函数或析构函数类型,也可以作为 union成员类型。 union可以为其成员指定 public、proteced和 private等保护标记,默认情况下,其成员都是公有的。...---- 19.7 局部类 局部类是指定义在某个函数内部,局部类定义类型只在定义它作用域内可见。 局部类所有成员(包括函数在内),都必须完整定义在内部。...在局部类中也不允许声明静态数据成员,因为没法定义这样成员。 外层函数对局部类私有成员没有任何访问特权。 局部类只能访问外层作用域定义类型名、静态变量以及枚举成员

72540

【《Effective C#》提炼总结】提高Unity中C#代码质量21条准则

属性允许将数据成员作为共有接口一部分暴露出去,同时仍旧提供面向对象环境下所需封装。属性这个语言元素可以让你像访问数据成员一样使用,其底层依旧是使用方法实现。...使用这种语法也就保证了你不会再添加构造函数时遗漏掉重要初始化代码。 综上,若是所有的构造函数都要将某个成员变量初始化成同一个值,那么应该使用初始化器。...你可以将某个所有构造函数统一成一个,并为所有的可选参数指定默认值。其他几个构造函数调用某个构造函数,并提供不同参数即可。...● C#不是C++,不能将所有类型定义成值类型并在需要时对其创建引用。C#也不是Java,不像Java中那样所有的东西都是引用类型。...将客户对内部数据成员访问限制在一部分功能中。 4)包装器(wrapper)。提供一个包装器,仅暴露该包装器,从而限制对其中对象访问

1.7K30

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

但是一个屋子有太多钥匙不太安全,故不要多给钥匙(友元不宜多用) 一.友元函数 友元函数可以直接访问私有成员,它是定义在外部普通函数,不属于任何需要在内部声明,声明时需要加friend...关键字 说明: 友元函数可访问私有和保护成员,但不是成员函数 友元函数不能用const修饰 友元函数可以在定义任何地方声明,不受访问限定符限制 一个函数可以是多个友元函数...例:比如下面Time和Date,在Time中声明Date为其友元,那么可以在Date中直接访问Time 私有成员变量,想在Time访问Date中私有的成员变量则不行。...内部类是一个独立,它不属于外部类,更不能通过外部类对象去访问内部成员。外部类对内部类没有任何优越访问权限。...注意:内部类就是外部类友元,参见友元定义,内部类可以通过外部类对象参数来访问外部类中 所有成员。但是外部类不是内部友元。

14610

C++从入门到精通——this指针

前言 this指针是一个特殊指针,在C++成员函数中使用。它指向调用该成员函数对象地址。通过使用this指针,成员函数可以访问和修改调用它对象属性和其他成员函数。...它引入主要是为了解决成员函数与成员变量同名问题。 在一个中,成员函数可以访问成员变量。当成员变量与成员函数参数同名时,如果没有使用this指针,编译器无法区分两者。...允许链式调用:this指针存在允许成员函数进行链式调用,即返回*this指针。 可以修改成员变量:使用this指针可以访问和修改当前对象成员变量。...缺少依赖库:如果代码中使用了某个依赖库,没有将其正确导入或链接到项目中,编译器将无法找到该库并报错。 重复定义:如果代码中定义了重复变量、函数或类型等,编译器将报错。...在成员函数中,可以使用this指针来访问当前对象成员变量和成员函数。在C++中,每个非静态成员函数都隐含地包含一个this指针。

25610

【笔记】《C++Primer》—— 第19章:特殊工具与技术

union和struct可对照着看,union特性是任意时刻只允许其中一个成员有值,然后同样可以和struct一样有丰富成员,当作一个简单来使用,默认访问控制符是public union不能继承其他...,让外部访问不同成员时按照情况析构union目前成员,构造新成员 19.7 局部类 类似于嵌套,局部类是定义在函数内部,局部类定义只在定义它作用域中可见 局部类特点是其所有成员都必须在内完成定义...局部类内还可以嵌套,但是嵌套可以定义在局部类外部,但是必须定义在与局部类相同作用域内 局部类内嵌套本质也属于一个局部类,所以嵌套自身成员必须定义在嵌套内部 19.8 固有的不可移植特性...对象赋值,我们必须自定义这些操作 使用volatile前要问自己使用这个特性是不是真的有意义,是不是真的需要 C++有时候需要调用其他语言编写函数,对于这样函数编译器尽管检查调用方法和C++函数一样...,但是生成代码有所差别,C++使用链接指示来指出那些非C++函数 使用其他语言函数前要确保有权使用其他语言编译器且与当前C++编译器是互相兼容 链接指示也就是在函数声明前写 extern "

82540

CC++面试题之语言基础篇(一)

c三大特点是: 封装:封装是将数据和操作数据方法封装在一个单元(内部,然后通过公共接口暴露有限访问权限。...private:私有继承,派生继承基私有成员,这些成员在派生中变为私有的,不能被外部访问。 C语言和C++区别 与C语言区别: C语言是面对过程,而C++是面对对象。...构造函数和析构函数:如果基构造函数和析构函数是公有的,子类可以直接访问它们;如果基构造函数和析构函数是受保护或私有的,子类仍然可以访问它们,只能在子类构造函数和析构函数内部调用它们,不能在外部使用...c++中A访问B私有成员解决方法 使用友元函数或友元:B中声明A为友元,或者在A中声明B为友元 提供公有成员函数或接口:如果希望B私有成员被A间接访问,可以在B中提供一些公有成员函数或接口...,以允许A通过这些函数来访问B私有成员

19310

《Effective C++》学习笔记

条款22:将成员变量声明为private 切记将成员变量声明为private,这可以保证客户访问数据一致性、可以细微划分访问控制、允许约束条件获得保证,并提供作者充分实现弹性来修改对其处理,因为这保证了...因为这种函数位于函数之外,不能访问private成员变量和函数,保证了封装性(没有增加可以看到内部数据函数量),此外,这些函数只要位于同一个命名空间内,就可以被拆分为多个不同头文件,客户可以按需引入头文件来获得这些函数...条款28:避免返回handles指向对象内部成分 避免让外部可见成员函数返回handles(包括引用、指针、迭代器)指向对象内部(更隐私成员变量或函数),即使返回const修饰也有风险。...如果是 is-a 关系,可以用继承,如果是 has-a 关系,应该将一个作为另一个成员变量来使用,以利用该类能力,而不是去以继承它方式使用。...条款52:写了 placement new 也要写 placement delete 如果你new接收参数除了必定有的size_t外还有其他,就是个placement new。

1.1K20

C++中静态变量和静态方法使用介绍

转自:https://www.cnblogs.com/sixue/p/3997324.html 最近一直看c++相关项目,总是会被c++静态成员变量与静态成员函数理解感觉很是模糊...,因此它不具有this指针.从这个意义上来说,它无法访问属于对象非静态数据成员,也无法访问非静态成员函数,只能调用其他静态成员函数....静态数据成员   在中,静态成员可以实现多个对象之间数据共享,并且使用静态数据成员还不会破坏隐藏原则,即保证了安全性。因此,静态成员所有对象中共享成员,而不是某个对象成员。   ...(2) 初始化时不加该成员访问权限控制符private,public等。   (3) 初始化时使用作用域运算符来标明它所属,因此,静态数据成员成员,而不是对象成员。   ...4、引用静态数据成员时,采用如下格式:    :: //静态变量使用方式   如果静态数据成员访问权限允许的话(即public成员),可在程序中,按上述格式来引用静态数据成员

1.3K20

一文让你学完C++,干货收藏!!!

派生可以访问中所有的非私有成员。...一个派生继承了所有的方法,下列情况除外: 基构造函数、析构函数和拷贝构造函数。...+ 重载运算符和重载函数 C++ 允许在同一作用域中某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。...这意味着它们只能被 Box 其他成员访问,而不能被程序中其他部分访问。这是实现封装一种方式。...为了使成员变成公有的(即,程序中其他部分也能访问),必须在这些成员前使用 public 关键字进行声明。所有定义在 public 标识符后边变量或函数可以被程序中所有其他函数访问

3.3K20

C++ OOP面向对象

其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供给外部接口来与你进行通信。根据c++特点,我们可以采用纯虚函数方式来实现。...好接口定义应该是具有专一功能性,而不是多功能,否则造成接口污染。如果一个只是实现了这个接口中一个功能,而不得不去实现接口中其他方法,就叫接口污染。...同时,有心朋友可以留意到微软在构建一个时,很多时候用到了对象组合方法。比如asp.net中,Page,有Server Request等属性,其实他们都是某个对象。...即: 1)公有( public )成员可以在访问。   2)私有( private )成员只能被该类成员函数访问。  ...3)保护( protected )成员只能被该类成员函数或派生成员函数访问

86410
领券