C++友元函数与拷贝构造函数详解

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技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 用C# 控制Windows系统音量的实现方法

    以下是详细讲解“用C# 控制Windows系统音量的实现方法”的完整攻略。 1. 需要的工具和环境 .NET Framework 4或以上版本 C# 编程环境,如Visual Studio 2. 获取音量调节API 要控制系统音量,我们需要使用Windows API,具体来说是Core Audio API。这是一个Windows自带的API,可以让我们访问和…

    C 2023年5月23日
    00
  • win10系统升级提示错误代码0x80070006-0x2000c该怎么解决

    win10系统升级提示错误代码0x80070006-0x2000c的解决方法 出现win10系统升级提示错误代码0x80070006-0x2000c的原因很多,包括错误的系统配置,损坏的文件或注册表项,软件冲突等等。下面是一些常用的解决方法: 方法一:运行Windows更新故障排除工具 Windows更新故障排除工具是解决Win10升级问题的有力工具。以下是…

    C 2023年5月23日
    00
  • MFC程序对文件的处理方法

    MFC程序对文件的处理方法主要包括文件的创建、读取、写入和关闭操作。下面将针对每一种操作进行详细讲解。 文件的创建 要在MFC程序中创建一个新文件,可以使用CFile类的Open方法,该方法会打开指定的文件并返回一个CFile对象,可以通过该对象对文件进行操作。 示例1:创建一个名为”test.txt”的文本文件 CFile file; if (file.O…

    C 2023年5月23日
    00
  • C#使用Clipboard类实现剪贴板功能

    C#使用Clipboard类实现剪贴板功能 导读 剪贴板是电脑生产过程中至关重要的一部分,通过使用剪贴板,我们可以在不同的应用程序和文本之间快速、方便地复制和粘贴数据。在C#中,我们可以使用Clipboard类来实现剪贴板的功能,本文将详细讲解如何在C#应用程序中使用Clipboard类来实现剪贴板功能。 使用Clipboard类 在C#中,Clipboar…

    C 2023年5月23日
    00
  • 激战2国服客户端官方文档具体内容

    激战2国服客户端官方文档 激战2官方文档是激战2国服的官方文档,提供了有关游戏的基础知识、游戏机制、角色职业、地图副本、PVP以及心灵法则等方面的完整介绍。本文将详细讲解激战2国服客户端官方文档的具体内容,以帮助广大玩家更好地了解游戏。 一、游戏机制 激战2国服客户端官方文档的第一部分介绍了游戏的基础知识和游戏机制。其中包括游戏的角色属性、技能系统、战斗机制…

    C 2023年5月22日
    00
  • vue-cli使用stimulsoft.reports.js的详细教程

    下面是“vue-cli使用stimulsoft.reports.js的详细教程”的完整攻略,包含两个示例: 1. 环境准备 在开始之前,需要确认电脑已经安装了以下软件: Node.js npm Vue CLI 如果没有安装,可以到官网下载安装对应版本。安装完毕后,打开命令行工具,输入以下命令进行版本确认: node -v npm -v vue –versi…

    C 2023年5月23日
    00
  • C++预定义的流对象基本示例详解

    C++预定义的流对象基本示例详解 在C++中,预定义了一些输入/输出流对象,它们可以方便地进行标准输入输出操作,可以大大简化我们的代码编写。本文将详细讲解C++预定义流对象的使用。 cin和cout cin和cout是C++中最常用的输入/输出流对象,它们分别用于输入数据和输出数据。下面是cin和cout的使用示例: #include <iostrea…

    C 2023年5月22日
    00
  • 超级好用的轻量级JSON处理命令jq(最新推荐)

    让我来详细讲解一下“超级好用的轻量级JSON处理命令jq(最新推荐)”的完整攻略。 什么是jq jq是一款用于处理JSON文本的命令行工具。它是由Stephen Dolan开发的,可以帮助我们轻松地从JSON文本中提取特定部分的数据、修改JSON文本以及格式化输出等。 安装jq 在使用jq之前,首先需要安装它。jq的安装非常简单,只需要使用系统包管理器进行安…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部