tttttt@@@@@@ 发表于 2023-6-9 10:40:04

友元与运算符重载

可以帮我解释一下吗

isdkz 发表于 2023-6-9 10:45:09

在C++中,友元(Friend)和运算符重载(Operator Overloading)是两个非常重要的概念。

1. 友元(Friend): 友元函数或友元类可以访问包含它的类的私有和保护成员。你可以通过在类定义中使用 "friend" 关键字来声明友元函数或类。

例如,如果我们有一个 "MyClass" 类,并希望一个名为 "myFriendFunction" 的函数能够访问它的私有成员,我们可以这样声明它:

class MyClass {
public:
MyClass(int x): x(x) {}

// 声明友元函数
friend void myFriendFunction(MyClass &mc);

private:
int x;
};

// 实现友元函数
void myFriendFunction(MyClass &mc) {
cout << "Accessing private member of MyClass: " << mc.x << endl;
}


在这个例子中,即使x是私有的,"myFriendFunction" 仍然可以访问它,因为它被声明为 "MyClass" 的友元函数。

2. 运算符重载(Operator Overloading): 运算符重载允许你重新定义大多数内置的运算符的行为,使它们在你的类的对象上执行自定义的操作。为了重载一个运算符,你需要提供一个函数,函数名是 "operator" 加上你想要重载的运算符。

例如,如果我们希望能够使用 "+" 运算符将两个 "MyClass" 对象的x成员相加,我们可以这样重载 "+" 运算符:

class MyClass {
public:
MyClass(int x): x(x) {}

// 重载 + 运算符
MyClass operator+(const MyClass &other) {
    return MyClass(this->x + other.x);
}

private:
int x;
};


然后,我们就可以使用 "+" 运算符来添加两个 "MyClass" 对象:

MyClass a(10);
MyClass b(20);
MyClass c = a + b;// c 的 x 成员现在是 30


在这个例子中,"+" 运算符被重载以返回一个新的 "MyClass" 对象,其x成员是两个被加对象的x成员的和。

tttttt@@@@@@ 发表于 2023-6-10 07:11:55

isdkz 发表于 2023-6-9 10:45
在C++中,友元(Friend)和运算符重载(Operator Overloading)是两个非常重要的概念。

1. 友元(Friend ...

在void myFriendFunction(MyClass &mc)中&mc是什么意思

isdkz 发表于 2023-6-10 09:46:48

tttttt@@@@@@ 发表于 2023-6-10 07:11
在void myFriendFunction(MyClass &mc)中&mc是什么意思

在C++中,函数参数的类型声明可能会包含一个或多个修饰符。在这个例子中,"&mc"的"&"是一个引用修饰符,表示参数"mc"是一个对"MyClass"类型对象的引用。

如果没有"&",那么在调用"myFriendFunction"时,会创建"MyClass"的一个新的副本。这被称为按值传递。这样的话,函数内对参数的修改不会影响到原始的"MyClass"对象。

但是,如果使用"&",那么"mc"就会变成对原始对象的引用,而不是一个新的副本。这被称为按引用传递。这样的话,函数内对参数的修改会直接影响到原始的"MyClass"对象。

在这个例子中,"&mc"表示"myFriendFunction"接受一个对"MyClass"对象的引用作为参数。所以,"myFriendFunction"内部对"mc"的修改会直接影响到传入的"MyClass"对象。
页: [1]
查看完整版本: 友元与运算符重载