c++ 成员函数和全局函数的转换

C++ 类与成员函数示例
本文介绍了一个简单的 C++ 类 Test1 的定义及其实现,并演示了如何使用成员函数进行两个对象的数据相加操作。同时展示了如何将类成员函数转换为全局函数的方法。
#include <iostream>
using namespace std;
class Test1
{
	
public:
	Test1(int a=0,int b=0)
	{
  		this->a=a;
		this->b=b;
	}
	//成员函数
	Test1& t_add(Test1 &t2)
    {
		this->a=this->a + t2.a;
		this->b=this->b + t2.b;
		return *this;
    }
	int a;
	int b;
protected:
};
Test1 t_add(Test1 &t1,Test1 &t2)
{
	Test1 t3;
	t3.a=t1.a+t2.a;
	t3.b=t1.b+t2.b;
	return t3;
}
void main()
{
	//从成员函数转化为全局函数 只需要加一个this 指针(指向本类的this指针)
	//从全局函数转化为类的成员函数,需要减一个左操作数参数
	Test1 t1(1,2),t2(3,4);
	//Test1 t3=t_add(t1,t2);
	t1.t_add(t2);
	printf("%d  %d\n",t1.a,t2.b );
	system("pause");
}

### C++ 全局函数成员函数的区别 #### 定义位置差异 全局函数是在全局作用域定义的函数,没有与特定类或对象关联。这类函数可以在程序任意部分调用,只要其可见即可[^1]。 ```cpp #include <iostream> // 全局函数定义 void globalFunction() { std::cout << "这是全局函数" << std::endl; } ``` 成员函数则是属于某个具体类的一部分,在该类内部定义并通常用于操作类的数据成员。成员函数可以通过创建的对象实例来调用,也可以通过指向此类的指针间接调用。 ```cpp class MyClass { public: // 成员函数定义 void memberFunction() const { std::cout << "这是成员函数" << std::endl; } }; ``` #### 访问权限不同 由于全局函数独立于任何类之外,因此它们无法直接访问非公共的类数据成员;而成员函数则可以直接访问所属类内的所有数据成员(包括私有的),因为这些数据对于所在类来说是默认可访问的。 #### 静态上下文支持情况 当涉及到静态环境时,只有标记为`static`的关键字修饰后的成员函数才能作为静态方法存在,并且能够像全局函数那样不依赖具体的对象实例就能被调用。然而,普通的成员函数总是需要有一个有效的对象来进行绑定调用[^2]。 ```cpp class AnotherClass { public: static void staticMemberFunction() { std::cout << "这是一个静态成员函数" << std::endl; } private: int privateData = 0; }; int main() { AnotherClass::staticMemberFunction(); // 不需实例化就可以调用 return 0; } ``` #### 函数指针适用性区别 在处理函数指针方面也有所区分:全局函数可以直接赋值给相应类型的函数指针变量;而对于普通成员函数而言,则必须先将其转换成静态形式之后再进行这样的操作,这是因为普通成员函数携带了一个隐藏参数——即`this`指针,这使得它不能简单地作为一个纯粹的过程地址对待。 ```cpp void (*globalFuncPtr)(); AnotherClass* obj; obj->memberFunction(); // 正常情况下这样调用成员函数 globalFuncPtr = &AnotherClass::staticMemberFunction; // 将静态成员函数赋予函数指针 (*globalFuncPtr)(); // 执行函数指针所指向的功能 ``` #### 使用场景建议 - **全局函数**适合用来封装那些不需要维护状态信息的操作逻辑,或者是提供一些工具性质的服务功能; - **成员函数**更适合表达面向对象编程范式下的行为模式,尤其是当某些动作紧密联系着特定实体的状态变化时[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值