C++友元函数与拷贝构造函数详解
什么是友元函数?
在 C++ 编程中,有时一个类的方法需要访问该类的私有成员或保护成员,而这些方法不属于该类,此时就需要用到友元函数。
友元函数是被许可访问该类的私有成员或保护成员的函数。当一个函数被声明为友元函数时,它被赋予了访问该类中所有成员变量和函数的特殊权限。
#include <iostream>
using namespace std;
class MyClass {
int num1;
float num2;
public:
MyClass() {
num1 = 0;
num2 = 0.0;
}
friend void setData(MyClass& obj, int num, float f); //声明友元函数
void getData(){
cout << "Num1: " << num1 << endl;
cout << "Num2: " << num2 << endl;
}
};
void setData(MyClass& obj, int num, float f){ //定义友元函数
obj.num1 = num;
obj.num2 = f;
}
int main() {
MyClass obj;
setData(obj, 100, 20.5);
obj.getData();
return 0;
}
上面的例子中,MyClass 类中的 setData 函数被声明为该类的友元函数,可以访问 MyClass 类中的私有成员 num1 和保护成员 num2。在主函数中,我们调用了 friend 函数 setData,并传递 MyClass 对象的引用,将参数值设置为 100 和 20.5。在 getData 函数中,我们展示了这些值,以确认 friend 函数已成功访问到私有成员。
什么是拷贝构造函数?
拷贝构造函数是一种特殊的成员函数,用于在创建对象时将另一个现有对象的值复制到新对象中。C++ 编译器会自动提供一个默认的拷贝构造函数,但是在某些情况下,我们需要自己定义一个自定义的拷贝构造函数。
#include <iostream>
using namespace std;
class MyClass {
public:
int x;
MyClass(int i) {
x = i;
}
MyClass(const MyClass& other) {
x = other.x;
cout << "Copy constructor is called." << endl;
}
};
int main() {
MyClass obj1(10);
MyClass obj2(obj1); //使用拷贝构造函数创建新的对象
cout << "Obj1: " << obj1.x << endl;
cout << "Obj2: " << obj2.x << endl;
return 0;
}
上面的例子中,我们定义了一个类 MyClass,并在其中实现了一个构造函数以及自定义的拷贝构造函数。在主函数中,我们使用拷贝构造函数创建了一个新的对象 obj2,该对象的值与 obj1 相同。注意,在创建 obj2 时,我们没有调用 MyClass 类的构造函数,而是使用了已存在的 obj1 对象的值。同时,在拷贝构造函数的实现中,我们从 other.x 中获取 obj1 的值并将其赋值给 obj2。
示例 1:友元类
一个类也可以成为另一个类的友元。这意味着另一个类可以访问该类中的所有成员及其函数。下面是一个使用类作为友元的例子。
#include <iostream>
using namespace std;
class MyClass2; //预定义类 MyClass2
class MyClass1 {
private:
int x;
public:
MyClass1() {
x = 0;
}
void setX(int i) {
x = i;
}
int getX() {
return x;
}
friend class MyClass2; // MyClass2 是朋友类
};
class MyClass2 {
private:
int y;
public:
MyClass2() {
y = 0;
}
void setY(int i) {
y = i;
}
void showData(MyClass1 obj) { // MyClass1 函数可以访问
cout << "X = " << obj.x << endl;
cout << "Y = " << y << endl;
}
};
int main() {
MyClass1 obj1;
MyClass2 obj2;
obj1.setX(10);
obj2.setY(20);
obj2.showData(obj1);
return 0;
}
在上面的例子中,我们定义了两个类 MyClass1 和 MyClass2。在 MyClass1 类中声明了 MyClass2 类作为该类的友元,因此 MyClass2 类可以访问 MyClass1 中的所有成员。在 MyClass2 中,我们实现了一个 showData 函数,该函数用于显示 MyClass1 和 MyClass2 中的成员值。在主函数中,我们创建了对象 obj1 和 obj2,并将它们的值设置为了 10 和 20。最后,我们调用 MyClass2 中的 showData 函数,以验证该函数已访问 MyClass1 中的私有成员。
示例 2:拷贝构造函数
拷贝构造函数可以用于创建一个新对象,使其具有现有对象的值。下面是一个使用拷贝构造函数的例子。
#include <iostream>
using namespace std;
class MyClass {
public:
int x;
MyClass(int i) {
x = i;
}
MyClass(const MyClass& other) {
x = other.x;
cout << "Copy constructor is called." << endl;
}
};
int main() {
MyClass obj1(10);
MyClass obj2(obj1);
cout << "Obj1: " << obj1.x << endl;
cout << "Obj2: " << obj2.x << endl;
return 0;
}
这个例子很简单。我们定义了 MyClass 类,该类具有一个构造函数和自定义的拷贝构造函数。在主函数中,我们定义了两个对象 obj1 和 obj2,其中 obj2 使用拷贝构造函数从 obj1 中获取其值。在输出中,我们可以看到拷贝构造函数被调用,用于将 obj1 的值复制到 obj2 中。
总结
友元函数和拷贝构造函数是 C++ 中两个非常重要的概念。友元函数允许非类成员函数访问类的私有成员和保护成员,而拷贝构造函数用于为一个对象创建一个新的对象,并复制已有对象中的值。本文详细说明了这两个概念,包括它们的工作原理和使用方式,并提供了两个示例程序以便更好的理解这两个概念。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++友元函数与拷贝构造函数详解 - Python技术站