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

为什么我们可以从c++中的成员函数访问non_member函数

在C++中,成员函数可以访问非成员函数,这是因为成员函数具有对类的所有成员的访问权限,包括非成员函数。

成员函数是定义在类内部的函数,它们可以访问类的私有成员、保护成员和公有成员。而非成员函数是定义在类外部的函数,它们没有直接访问类的成员的权限。

当一个成员函数需要调用一个非成员函数时,可以直接通过函数名进行调用。这是因为在C++中,成员函数和非成员函数都属于同一个命名空间,因此成员函数可以直接访问非成员函数。

这种设计使得C++中的类具有更高的灵活性和可扩展性。通过将相关的函数组织在一起,可以更好地管理和维护代码。非成员函数可以用于实现一些与类相关但不需要直接访问类成员的功能,从而提高代码的模块化程度。

以下是一个示例代码,展示了如何从C++中的成员函数访问非成员函数:

代码语言:txt
复制
#include <iostream>

// 非成员函数
void nonMemberFunction() {
    std::cout << "This is a non-member function." << std::endl;
}

class MyClass {
public:
    void memberFunction() {
        std::cout << "This is a member function." << std::endl;
        
        // 调用非成员函数
        nonMemberFunction();
    }
};

int main() {
    MyClass obj;
    obj.memberFunction();
    
    return 0;
}

输出结果为:

代码语言:txt
复制
This is a member function.
This is a non-member function.

在这个示例中,memberFunction是一个成员函数,它可以直接调用nonMemberFunction这个非成员函数。

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

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发:https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/tbaas
  • 腾讯云元宇宙:https://cloud.tencent.com/product/tencent-metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++const成员变量和成员函数

在类,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。...初始化 const 成员变量只有一种方法,就是通过构造函数初始化列表,这点在前面已经讲到了,请猛击《C++初始化列表》回顾。...const成员函数(常成员函数) const 成员函数可以使用类所有成员变量,但是不能修改它们值,这种措施主要还是为了保护数据而设置。const 成员函数也称为常成员函数。...我们通常将 get 函数设置为常成员函数。读取成员变量函数名字通常以get开头,后跟成员变量名字,所以通常将它们称为 get 函数。...,仅仅是为了获取成员变量值,没有任何修改成员变量企图,所以我们加了 const 限制,这是一种保险做法,同时也使得语义更加明显。

21130

_类内成员函数可以访问本类对象私有成员

类内成员函数可以访问本类对象私有成员 sList是一个类 私有成员是head,有一个成员函数形参是本类对象(引用,引不引用不影响结论和原因) ==为什么呢!...head明明是b私有成员为什么可以访问了!!??== 因为!...对象b是sList类,而这个intersection函数是sList成员函数 head虽然是sList类对象私有成员,但是是在sList类内访问 ==就是 在类内访问了本类(实例化对象)私有成员...本来就是类成员,只是抽象和实例化问题 这非常合理地体现了 类 封装性 这个就是不行,在类外访问了 这一点是非常好用可以利用这一点 ==用成员函数肆无忌惮地访问对象私有成员!...==只要声明函数是类成员函数,将外部同类对象设为形参(或加个引用)就可以了!! 不必再为如何访问到同类外部对象私有成员而苦思了!

82830

C++C++ this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

一、常量成员函数 1、const 修饰成员函数分析 在 C++ , 普通非静态成员函数 , 可以使用 const 进行修饰 , 在 下面的 Student 类 , 定义了 void fun(int...与 非静态普通成员变量 都不能修改 ; 不能调用非常量成员函数 : 只能调用 " 常量成员函数 " , 不能调用 非常量成员函数 , 以保证不会修改 成员变量 ; " 常量成员函数 " 只能访问 常量成员变量...其它常量成员函数 如果类 成员变量 不是 常量 , 那么 " 常量成员函数 " 不能访问它们 ; public: int age; // 年龄 int height; // 身高 如果类...成员变量 是 常量 , 那么 " 常量成员函数 " 可以访问它们 , 注意 : 只能访问 , 不能修改 ; public: const int age; // 年龄 const int height...; // 身高 如果 成员函数 被 const 关键字 声明为 常量成员函数 , 则在该函数 不能修改 类对象 任何成员变量 ; class Student { public: void fun

18520

C++入门到精通——类6个默认成员函数之构造函数

默认成员函数:用户没有显式实现,编译器会生成成员函数称为默认成员函数。 class Date {}; 一、构造函数概念 C++构造函数是一种特殊成员函数,用于创建和初始化类对象。...我们可以在构造函数成员变量进行赋值或执行其他初始化操作,以确保对象在创建时具有合适初始状态。 使用构造函数可以方便地创建对象并进行初始化操作,提高代码简洁性和可读性。...在C++,构造函数在对象创建时自动调用,而析构函数则在对象被销毁时自动调用,它们共同组成了C++构造函数和析构函数机制,用于管理对象生命周期。...,自定义类型就是我们使用class/struct/union等自己定义类型,看看下面的程序,就会发现编译器生成默认构造函数会对自定类型成员_t调用默认成员函数。...注意:无参构造函数、全缺省构造函数我们没写编译器默认生成构造函数,都可以认为是默认构造函数

12610

C++static成员函数以及static成员变量详解「建议收藏」

static成员变量,在编程我们时常都会遇到,那么你是否对static变量以及static成员函数有一定深入认识呢?...int Student::m_rate = 5; // 类外初始化static变量 int main() { Student::set_rate(6); // static 成员函数可以直接使用类名进行访问...,也可以使用对象进行调用访问 system("pause"); return 0; } 在C++中有时会定义一些static变量,同时也会定义一些static成员函数。...对于static成员函数以及属性调用需要注意点有以下几个: 1.static成员函数调用成员变量(属性)只能够是static成员属性,不能够调用普通成员变量属性(因为编译器无法确定调用是哪个对象成员属性...4.static成员属性以及static成员函数都不存在this指针(并不属于任何一个成员); 5.static成员属性能够被继承,可以在派生类访问到(前提:原有属性为公有,继承为公有继承),但是存储只是一份数据

80930

C++入门到精通——类6个默认成员函数之拷贝构造函数

拷贝构造函数 前言 一、拷贝构造函数概念 理解 定义 二、拷贝构造函数特征 三、注意要点 写法 实践 前言 类6个默认成员函数:如果一个类什么成员都没有,简称为空类。 空类真的什么都没有吗?...class Date {}; 一、拷贝构造函数概念 理解 在现实生活,可能存在一个与你一样自己,我们称其为双胞胎。 那在创建对象时,可否创建一个与已存在对象一某一样新对象呢?...C++拷贝构造函数是一种特殊构造函数,用于创建对象时,使用一个已有对象内容来初始化新对象。它接受一个同类对象作为参数,并按照该对象数据成员值来创建新对象。...如果类包含指针类型数据成员,需要自己定义拷贝构造函数,进行深拷贝,确保指针指向对象也被复制。 注意,拷贝构造函数是类成员函数,通常定义在类公有部分。...如Date(日期类) 如果都是自定义类型成员,内置类型成员没有指向资源,也类似默认生成拷贝构造函数可以

23510

C++入门到精通——类6个默认成员函数之析构函数

析构函数 前言 一、析构函数概念 二、析构函数特性 三、析构函数练习题 四、总结 前言 类6个默认成员函数:如果一个类什么成员都没有,简称为空类。 空类真的什么都没有吗?...在C++,析构函数是一种特殊成员函数,用于在对象被销毁时清理其使用资源。它名称与类名称相同,前面加上一个波浪线(~),没有返回类型,也不接受任何参数。...下面的程序我们会看到,编译器生成默认析构函数,对自定类型成员调用它析构函数。跟构造函数类似,内置类型不做处理,自定义类型调用它析构函数。...Time类对象,为什么最后会调用Time类析构函数?...,销毁那个类对象则调用该类析构函数 如果类没有申请资源时,析构函数可以不写,直接使用编译器生成默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

19810

C++一分钟之-C++静态成员与静态函数

C++编程,静态成员与静态函数是类设计重要概念,它们打破了常规成员“每个对象一份”规则,为类所有实例共享同一份数据或行为提供了途径。...避免策略:在类内或外部显式初始化静态成员,确保有序初始化。 访问权限:误以为静态成员可以直接通过类名访问而忽视访问权限。 避免策略:遵守访问控制规则,私有静态成员不能直接类外访问。...静态成员函数 基本概念 静态成员函数不依赖于类任何实例,它可以通过类名直接调用,不接收隐含this指针。 用途 工具函数:执行与类相关操作,但不需要访问非静态成员。...访问静态成员:操作静态成员变量理想场所。 常见问题与避免 误用this指针:静态成员函数不存在this指针,尝试使用会导致编译错误。...通过本文介绍和示例,希望你能准确把握静态成员与静态函数精髓,避开常见陷阱,更加自信地在C++项目中运用它们。

13410

C++核心准则C.4:只有直接访问表达函数,才应该成为成员

和使用成员函数相比普通函数耦合性略低,一方面可以通过修改对象状态带来麻烦函数会变少,另一方面可以减少改变类表达时需要修改函数数量。...如果C++可以导入“统一函数调用”这条准则甚至会变得更完美。 译者注:“uniform funcation call”是C++之父本人提出C++语法建议。...(C++)语言要求虚函数必须是成员,而且不是所有的虚函数都会直接访问数据。通常抽象类成员很少直接访问数据。 Note multi-methods....寻找没有直接接触数据成员非虚成员函数。讽刺是存在许多不需要直 接访问数据成员成员函数。 Ignore virtual functions. 忽略虚函数。...如果一组重载函数至少有一个函数访问了私有成员,那么忽略其他函数。 Ignore functions returning this. 忽略返回this指针函数

33320

C++C++ this 指针用法 ③ ( 全局函数成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

一、全局函数成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数 , 通过 this 指针访问对象本身成员 ; 在全局函数 , 实现两个 Student 类相加 , 接收两个...; 如下带参数构造函数 , 并且为其 有参构造函数 参数 设置一个默认值 , 此时就可以使用 类名 对象名 方式定义对象变量 ; class Student { public: // 带参构造函数...height; // 身高 }; 此时就可以使用默认构造函数 , 创建 Student 对象 ; 三、返回匿名对象与返回引用 ---- 在上面的章节 , 将 两个 Student 对象相加 ,...返回是一个匿名对象 , 该匿名对象 是在 成员函数 中新创建对象 ; // 成员函数, 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 返回一个新

17920

C++】构造函数初始化列表 ③ ( 构造函数 初始化列表 为 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 为 类 成员变量 提供初始值 ; 初始化列表 可以 调用 类 成员变量 类型 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 初始化列表 为 const 成员变量初始化 1、初始化 const 常量成员 如果 类 定义了 被 const 修饰 成员变量...} // 构造函数参数可以作为 参数列表 参数值 B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA...(10), m_a(10, 150), m_const_int(888) {} // 构造函数参数可以作为 参数列表 参数值 B(int age, int ageOfA, int heightOfA

18030

C++入门到精通——类6个默认成员函数之赋值运算符重载

友元函数可以是全局函数,也可以是其他类成员函数。在C++,使用关键字friend来声明友元函数。友元函数定义通常在类外部。...友元函数特点是可以绕过类访问权限,直接访问私有成员和保护成员。这在一些特殊情况下很有用,例如需要在其他类对该类私有成员进行操作或者需要在全局函数操作该类私有成员。...友元函数具体用法可以分为两种情况: 全局函数作为友元函数:全局函数可以在类外部定义,并通过friend关键字声明为友元函数。在全局函数定义可以直接访问该类私有成员和保护成员。...对象成员函数作为友元函数:在另一个类成员函数通过友元关键字将该类成员函数声明为友元函数。在友元函数定义可以直接访问该类私有成员和保护成员。...需要注意是,友元函数并不是类成员函数,因此不能直接访问成员变量和成员函数。如果需要访问成员变量和成员函数可以通过对象来访问

10210

C++】继承 ④ ( 继承对访问控制权限影响 | 访问权限判定 | 继承不包括构造与析构函数 | 继承改变成员访问权限 )

一、继承相关概念 1、继承不包括构造与析构函数 子类 继承 父类 所有成员 , 包括 成员变量 和 成员方法 ; 子类 不会 继承 父类 构造函数 和 析构函数 ; 2、继承改变成员访问权限 父类... 成员变量 和 成员方法 访问属性 , 在 子类 可以调整 ; 如 : private , protected , public 访问属性 , 在 子类 可以发生改变 ; 二、访问控制权限回顾...1、访问权限 访问控制权限 : 公有成员 public : 公有成员可以被任何对象访问 , 包括类外部和所有该类派生子类 ; 完全开放 : 如果一个成员被声明为公有 , 那么它可以在任何地方被访问...private : 私有成员 只能被该类成员函数访问 , 包括友元函数和派生类覆盖函数 ; 完全封闭 : 在 类外部 和 子类 中都不能访问私有成员 ; private 是最安全访问控制级别...---- 1、访问权限判定 C++ 继承方式 对 子类 成员变量 和 成员方法 会造成影响 , 成员访问属性 需要看根据下面的逻辑进行判定 : 调用位置 : 看是在哪调用 , 在 类内部 ,

20510

关于C++操作符重载疑问 :四个运算符=, ->, [], ()不可以重载为全局函数(友员函数

C++规定有四个运算符 =, ->, [], ()不可以是全局域中重载(即不能重载为友员函数),这是为什么呢?...那么为什么赋值运算符不可以重载为类友元函数?像同样都是双目运算符+为什么它就可以呢?...在此,我们可以C++规则做出以下判断:   当类没有定义赋值运算符重载成员函数时(注意,在未定义形参数据类型为该类类型赋值运算符重载函数时,编译器会自动生成加入),当程序执行到某一赋值语 句时,...当明白上面的规则后,现在就可以回过来,讨论为什么赋值运算符不可以重载为类友元函数了。 我们知道友元函数不是类成员函数,它只是类“朋友“,具有访问把它声明为“朋友”数据成员权限而已。...例当类A没有定义运算符->重载成员函数,但是我们仍然可以对类A对象指针用->形式调用指针指向对象里成员

98020

实战遇到C++流文件重置一个大陷阱 为什么ifstreamseekg函数无效

今天下午遇到这样一个问题: 逐行读取了test.txt文件后, 后续需要继续从头开始重新逐行读取, 用C++怎么做呢?...新改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新界面设计 ,将会带来全新写作体验; 在创作中心设置你喜爱代码高亮样式...图片: 带尺寸图片: 当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。...你可以找到更多关于信息 LaTeX 数学表达式here....导入 如果你想加载一篇你写过.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名文件导入, 继续你创作。

41130

C++特殊定制:揭秘cpo与tag_invoke!

导语 | 本篇我们将重点介绍c++特殊定制, cpo与tag_invoke这部分内容,希望对这部分感兴趣开发者提供一些经验和思考。 前言 上一篇《C++尝鲜:在C++实现LINQ!》...这样做好处: 一方面,我们可以将原来需要依赖虚表来完成多态特性,转变为纯粹静态调用,明显性能更高。 另一方面,基类可以无成本访问子类功能和实现,这肯定比标准多态自由多了。...main() Line 93 C++ 可以直观看到当我们调用std::ranges::begin()时候,访问是上面给出源码_Begin_Cpo对象operator()操作符,最终符合我们预期访问到了...rangescpo实现可以看到,相关代码使用和组织因为层层namespace定义,和关联对象声明实现,整体复杂度还是会比较高,如果库本身涉及cpo很多,那么理解相关实现肯定就会比较麻烦...目前负责CrossEngine Server开发工作,对GamePlay技术比较感兴趣。  推荐阅读 C++尝鲜:在C++实现LINQ! C++异步理论到实践! 全面解读!

79610

【细品C++】初识类和对象

但是由于C语言语法,也没什么好解决方式了。 而为了解决这个问题,C++设计了类(struct和class)。在C++我们可以成员变量和管理用函数同时定义在类。...,所以我会在之后继承博客讲解) 访问权限作用域访问限定符出现位置开始直到下一个访问限定符出现位置为止 如果后面没有访问限定符,作用域就到类结尾(即})结束 class默认访问权限为private...对象大小 那么如果你已经足够了解计算结构体大小的话,我们再来看看C++,类(对象)是如何计算。与结构体不同,类不仅仅有成员变量,还有成员函数。...以上实验可以暂且得出一个结论:计算C++大小,规则是与C计算结构体大小一样(内存对齐),并且不用考虑成员函数。 存储方式 那么现在看来,为什么C++要采用这样设计呢?...C++通过类可以将数据以及操作数据方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己成员一样,更符合人类对一件事物认知。

15130
领券