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日

相关文章

  • iPhone6c什么时候上市?苹果iPhone6c报价多少钱?

    iPhone 6c 介绍 苹果公司于2015年推出了iPhone 6和iPhone 6 Plus,这两款手机都采用了全新的设计风格,并迅速得到消费者的喜爱。接着,苹果又推出了iPhone SE,这款手机采用了iPhone 5s的外观设计但换装了A9处理器,提供了更好的性能和更低的价格。而对于iPhone 6的后续产品,苹果一直没有推出iPhone 6c,这让…

    C 2023年5月22日
    00
  • Basic求10000以内的完美数

    下面是 “Basic求10000以内的完美数” 的完整攻略: 任务描述 在Basic语言中,编写代码搜索10000以内的所有完美数并输出。 任务分析 完美数是指一个数等于其自身所有因子(不包括自己)之和,例如:6就是完美数,它的因子为1、2、3,而1 + 2 + 3正好等于6。因此,我们可以采用以下方法来寻找10000以内的完美数: 遍历1~10000之间的…

    C 2023年5月22日
    00
  • python转换wrf输出的数据为网页可视化json格式

    下面我将详细讲解如何使用Python将WRF模式输出的数据转换为可视化的JSON格式,让其可以在网页上进行展示。 步骤一:安装必要的Python库 首先,我们需要安装一些必要的Python库来进行数据处理和可视化。在这里我们使用以下Python库: netCDF4:一个用于读取和写入netCDF文件的Python库 numpy:一个用于科学计算的Python…

    C 2023年5月23日
    00
  • C++中的对象数组详细解析

    C++中的对象数组详细解析 什么是对象数组 对象数组是指由多个相同类型的对象依次排列组成的数组。在 C++ 中,一个对象数组一旦被定义,就会在内存中分配相应的空间,同时数组名也被定义为一个指向该数组首元素的指针。 定义一个对象数组示例: class Person { public: Person(string name, int age) { this-&g…

    C 2023年5月22日
    00
  • SQL Server 利用触发器对多表视图进行更新的实现方法

    SQL Server 利用触发器对多表视图进行更新的实现方法是一个比较常见的问题,它需要借助于视图、触发器、存储过程等多种技术。下面是一个详细的攻略: 1. 创建多表视图 多表视图是由多个基本表结合而成的虚拟表,可以实现数据的分组、组合、限制等操作。在创建多表视图时,需要使用“CREATE VIEW”语句,并在其中指定所需的基本表和字段。 示例1: CREA…

    C 2023年5月22日
    00
  • 基于C语言代码实现点餐系统

    为了实现基于C语言的点餐系统,可以遵循以下步骤: 一、需求分析与系统设计 首先,需要进行需求分析,确定该点餐系统的功能,例如: 能够看到菜单列表,并选择自己喜欢的菜品; 对菜品进行数量和规格的选择; 能够查看订单详情并确认下单; 后台能够统计销售数据并进行简单分析。 根据这些需求,我们可以设计系统的具体实现。对于一个简单的点餐系统,可以设计以下模块: 菜单管…

    C 2023年5月23日
    00
  • C语言从零探索函数的知识

    C语言从零探索函数的知识 1. 函数基础 1.1 函数的作用与定义 函数是编程语言中非常重要的一部分,它可以把复杂的逻辑代码封装成简单易用的组件,方便我们进行调用和管理。一个完整的函数定义一般包含函数名、参数列表以及函数体。例如: int add(int a, int b) { return a + b; } 1.2 函数的调用与返回值 在函数定义好之后,我…

    C 2023年5月23日
    00
  • C语言实现病例管理系统

    C语言实现病例管理系统攻略 1. 简介 病例管理系统是医院或诊所等医疗机构常用的一种信息管理系统,通过该系统能够快速有效地管理病人的基本信息、病史以及药物处方等。这需要使用到C语言的数据类型、字符串操作等基本操作,实现起来比较简单。 2. 实现流程 2.1 确定需求 首先,我们需要明确病例管理系统需要具备哪些功能,如:添加病例、删除病例、修改病例、查询病例等…

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