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

类内的朋友函数和类外的朋友函数有什么区别?

类内的朋友函数和类外的朋友函数是面向对象编程中的概念,用于描述函数与类的关系。

类内的朋友函数是指在类的定义中声明的函数,可以访问类的私有成员和保护成员,具有与类的成员函数相同的访问权限。类内的朋友函数可以直接通过对象调用,也可以通过对象的指针或引用调用。

类外的朋友函数是在类的定义外部声明的函数,但在类的定义中通过friend关键字进行了声明,使其成为类的友元函数。类外的朋友函数可以访问类的私有成员和保护成员,具有与类的成员函数相同的访问权限。类外的朋友函数可以通过对象的指针或引用调用,但不能直接通过对象调用。

区别:

  1. 声明位置不同:类内的朋友函数在类的定义中声明,类外的朋友函数在类的定义外部声明。
  2. 访问权限不同:类内的朋友函数具有与类的成员函数相同的访问权限,可以访问类的私有成员和保护成员;类外的朋友函数也可以访问类的私有成员和保护成员,但不能直接通过对象调用。
  3. 调用方式不同:类内的朋友函数可以通过对象调用,也可以通过对象的指针或引用调用;类外的朋友函数只能通过对象的指针或引用调用,不能直接通过对象调用。

类内的朋友函数和类外的朋友函数在实际应用中的选择取决于具体的设计需求和访问权限的控制。在设计类时,可以根据需要将某些函数声明为类的友元函数,以便其能够访问类的私有成员和保护成员,但同时也要注意友元函数的使用应该符合封装性和安全性的原则。

腾讯云相关产品和产品介绍链接地址: 暂无相关产品和链接。

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

相关·内容

Thinkphp公共函数什么区别

比如我要写一个用户验证(CheckUser),我可以写在Commonfunction.php中,也可以写在Model里CheckUserModel.class.php里。他们什么区别?..., 而且Class中定义函数变量自身也高端相关, 针对性更强....就你说用户验证为例, checkUser函数不是简单一个功能, 他需要读取数据库(调用Model), 可能还有一些我们一般都会用到相关函数(比如getUser, getUserGroup等), 各函数还会有公用变量一些定义...(比如实例化时候公用构造函数, 还有比如UID等变量可能也需要共用), 所以, 理解成一个简单功能(function肯定是不合适), 所以还是建议放在Model里面....函数方法区别 函数,你可以当做一个算法实现。函数是单独存在,也就是面向过程部分定义。 方法,则可以当做一个业务逻辑实现。方法是依赖于存在,也就是面向对象中定义

99130

朋友学C++(10):子类构造函数调用父构造函数

从哲学层面来看,子类会继承父除private以外所有成员。 因为构造函数是公有的,所以理所当然地会被子类继承。...分析: 这里构造函数写法是 Rectangle() : Shape() { 子类构造函数本身语句; } 这是先调用父构造函数,再执行它本身语句。从运行结果也可以看出这一点。...那么,如果不显示调用父构造函数Shape()呢?父构造函数就不被调用了吗? 咱们可以用下面的程序来验证。...分析: 从运行结果可以看出,程序1程序2运行结果完全一致。也就是说,Shape()即使不显示调用,实际上也会被调用。并且调用顺序优先于子类本身构造函数

1.4K60
  • 构造函数析构函数

    一、构造函数析构函数由来 数据成员不能在声明时候初始化,为了解决这个问题? 使用构造函数处理对对象初始化。...二、构造函数 (1)初识初始化 C++支持两种初始化形式:复制初始化直接初始化,对于直接初始化直接调用实参匹配构造函数,复制初始化总是调用复制构造函数。...(2)初始化构造函数关系 常用初始化方式大概以下5种: ClassTest ct1("ab"); ClassTest ct2 = "ab"; ClassTest ct3 = ct1; ClassTest...“当用于类型对象时,初始化复制形式直接形式有所不同:直接初始化直接调用与实参匹配构造函数,复制初始化总是调用复制构造函数。...三、析构函数 析构函数构造函数作用相反,释放对象使用资源,并销毁非static成员。 (1)内存泄漏 下面代码何隐患?

    1.8K20

    实现成员函数好处(C++)

    ,总会有一个未定义报错,且JieGay始终无法访问到MyHouse私有成员 杰哥不要啦~ ---- 错因 对着教程又仔细看了一遍,发现自己跟教程唯一不同就是教程成员函数是在实现,而我写是在实现...MyHouse构造函数 MyHouse::MyHouse() { mSittingRoom = "客厅"; mBedRoom = "卧室"; } //实现JieGay构造函数 JieGay...::JieGay( { m = new MyHouse; } //实现JieGay成员函数 void JieGay::visit() { cout << "杰哥正在访问:" << m...---- 反思 仔细想了一下,前后区别只是编译顺序不同,编译器是从上往下编译,如果在就实现成员函数,编译时候必然会出现一方未定义情况,而如果改为实现,则可以随意控制函数编译顺序,让前置类型先编译出来...虽然之前也学过实现写法,但嫌麻烦一直没用,今天总算是明白实现好处了。。。

    63920

    A成员函数B友元函数

    首先,我们要实现让 ManagerPoint 成员函数 distance() 操作 Point 私有数据成员_x_y,所以要将 ManagerPoint distance() 函数在...,所以他找不到,这样我们需要将 ManagerPoint 声明定义移动到 Point 之前。...不,还没那么简单,这样编译后,又出现了新问题,如下图: 编译器提示,Point是一个未定义,因为我们直接操作了Point_x_y成员,而我们之前只给出了Point一个前向声明,并没有告诉它...函数声明,而把distance() 函数实现放到 Point 后面,是不是就可以避免以上所有遇到问题了呢?...,某一个成员函数作为另外一个友元函数实现。

    14840

    - 高级函数

    高级函数今天来为大家介绍几个高级函数,它们也是内置函数。通过使用它们, 会让我们在进行开发时候更加顺手,接下来我们就看看是哪些函数,让我们一个个认识它们。...通常我们是返回一个字符串信息,作为介绍这个信息。...test = Test()print(test)# >>> 执行结果如下:# >>> 这是关于这个描述信息 __getattr____getattr__ 函数功能:当调用属性或方法不存在时候,...__setattr____setattr__ 函数功能:拦截当前中不存在属性值,对它们可以进行一些业务处理。...:本质上是将一个实例化后变成一个函数__call__ 函数用法:示例如下def __call_(self, *args, **kwargs): print('call will start'

    11800

    函数学习

    x''y'自己地址与'a''b'无任何关系 //因此'a''b'地址值不变,打印结果也就不变}//指针思想#includevoid Swap2(int* pa, int*...#includeint add(int a,int b)//括号为形参{ int z = a + b; return z;}//当下面不调用add函数时,上方括号a,...(指针思想为例)函数调用传值调用函数形参实参分别占有不同内存块,对形参修改不会影响实参传址调用(指针思想)传址调用是把函数外部创建变量内存地址传给函数参数一种调用函数方式这种方式可以让函数函数外边变量建立起真正联系...printf函数参数,即方式2//两种方式都可以运行,方式2为链式访问,更为简洁函数声明定义函数声明1.告诉编译器函数叫什么,参数是什么,返回类型是什么。...,因为定义条件递归两个必要条件存在限制条件,当满足这个限制条件时候,递归便不再继续每次递归调用之后越来越接近这个限制条件。

    30340

    使用Python构造函数析构函数

    1、问题背景当使用Python时,可以使用构造函数析构函数来初始化清理实例。构造函数在创建实例时自动调用,而析构函数在删除实例时自动调用。...在上面的代码示例中,Person具有一个构造函数__init__一个析构函数__del__。...构造函数__init__在Person实例被创建时被调用,它将实例name属性设置为传入参数,并将实例的人口计数population加1。...析构函数__del__在Person实例被删除时被调用,它将实例的人口计数population减1。...问题是,如果我在程序中显式地删除Person实例,析构函数__del__是否会被自动调用,或者我是否需要在“main”程序/中添加一些东西,如上面的代码示例所示?

    15610

    派生对基中虚函数非虚函数继承效果

    ,在编译阶段就确定好是被谁调用,所以他只认哪个指针指向自己,这里是Animal指针指向,所以他就调用Animal里面的,普通函数是父为子类提供“强制实现”,也就是只要是父指针调用普通函数,那就是父普通函数...而虚函数作用,主要是为了让父指针可以调用子类函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++函数主要作用是“运行时多态”,父中提供虚函数实现,为子类提供默认函数实现。...子类可以重写父函数实现子类特殊化。 2、纯虚函数:   C++中包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数子类才能new出对象。   ...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系中,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

    7910

    朋友学Python(23):属性与方法

    (一)私有属性 __private_attr:两个下划线开头,声明该属性为私有,不能在外部被使用或直接访问。在内部方法中使用时 self.__private_attrs。 比如:self....__wife (二)私有方法 __private_method:两个下划线开头,声明该方法为私有方法,不能在外部调用。 在内部调用方式为self....__privateCount AttributeError: MyCounter instance has no attribute '__privateCount' Python不允许实例化访问私有数据..._foo: 以单下划线开头表示是 protected 类型变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import * __foo: 双下划线表示是私有类型...(private)变量, 只能是允许这个本身进行访问了。

    58980

    string函数讲解

    kw=string 这个网站是C++官方网站,里面对于各个关键字函数讲解都是很官方,大家有需要时候可以参考 我们对string进行一个简单总结: string是表示字符串字符串 该类接口与常规容器接口基本相同...这里一个需要注意点: 在使用string时,必须包含#include头文件以及using namespace std; 下面我们就对string一些常用接口进行讲解: string常用接口说明...string对象访问及遍历操作 operator[],就是返回该位置字符,其实就是用于循环: 但是要注意一点,如果访问越界,就会直接报错,导致程序终止 并且该函数一般只适用于数组结构 #include...rbegin已经不在字符串第一个位置了二者是区别的,并且,这里指针也是++,不然怎么会叫做反向迭代器呢?...string非成员函数 其实这里用不多,不做过多讲解 但是这个getline函数是可以用到一些题目中来读取字符串,他遇到换行符就会停止读取,遇到空格不会: int main() { std

    6110
    领券