首页 > 编程语言 >C++面试考点:拷贝赋值运算符和拷贝构造函数有什么区别?

C++面试考点:拷贝赋值运算符和拷贝构造函数有什么区别?

时间:2024-09-17 13:56:05浏览次数:13  
标签:对象 运算符 other MyClass 拷贝 构造函数

  1. 定义和功能

    • 拷贝构造函数

      • 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,该新对象是作为另一个同类型对象的副本而创建的。其函数原型通常为类名(const 类名& other)(在 C++ 11 之前,const也可省略)。例如:
        class MyClass {
        public:
            MyClass(const MyClass& other);
        };
      • 它主要用于初始化新对象,在以下几种情况下被调用:
        • 用一个已存在的对象初始化一个新对象时,如MyClass obj1; MyClass obj2 = obj1;或者MyClass obj3(obj1);
        • 函数参数按值传递对象时,例如void func(MyClass param); MyClass obj; func(obj);,在调用func函数时,会调用拷贝构造函数来创建param对象。
        • 函数返回值按值返回对象时,如果函数返回一个MyClass类型的对象,会调用拷贝构造函数创建一个临时对象用于返回。
      • 拷贝赋值运算符
        • 拷贝赋值运算符用于将一个对象的值赋给另一个已存在的同类型对象。其函数原型为类名& operator=(const 类名& other)。例如:
          class MyClass {
          public:
              MyClass& operator=(const MyClass& other);
          };
        • 当执行类似MyClass obj1, obj2; obj2 = obj1;这样的操作时,就会调用拷贝赋值运算符。它的任务是将obj1的状态复制到obj2中,并且要正确处理资源的释放和重新分配(如果对象管理资源,如动态分配的内存等)。
        • 调用时机

          • 拷贝构造函数
            • 在对象创建时被调用,是对象初始化过程的一部分。
          • 拷贝赋值运算符
            • 在已存在的对象被赋予新值时被调用。
        • 对对象状态的影响

          • 拷贝构造函数
            • 创建一个全新的对象,并从另一个对象初始化它的初始状态。
          • 拷贝赋值运算符
            • 修改一个已存在对象的状态,使其与另一个对象相同。
        • 示例代码对比

          • 拷贝构造函数示例
            class Person {
            private:
                std::string name;
                int age;
            public:
                Person(const Person& other) : name(other.name), age(other.age) {
                    std::cout << "拷贝构造函数被调用" << std::endl;
                }
            };
            int main() {
                Person p1;
                Person p2 = p1; // 调用拷贝构造函数
                return 0;
            }

          • 拷贝赋值运算符示例
            class Person {
            private:
                std::string name;
                int age;
            public:
                Person& operator=(const Person& other) {
                    if (this!= &other) {
                        name = other.name;
                        age = other.age;
                    }
                    std::cout << "拷贝赋值运算符被调用" << std::endl;
                    return *this;
                }
            };
            int main() {
                Person p1;
                Person p2;
                p2 = p1; // 调用拷贝赋值运算符
                return 0;
            }

 

喜欢可以点点关注!咱们下期见!

标签:对象,运算符,other,MyClass,拷贝,构造函数
From: https://blog.csdn.net/a915227127/article/details/142313721

相关文章

  • Python中的逻辑运算符:解锁编程世界的隐形钥匙
    引言逻辑运算符是任何编程语言的基础组成部分之一,在Python中也不例外。它允许我们基于一个或多个布尔表达式的真假值来决定程序的行为。在日常开发工作中,逻辑运算符广泛应用于条件判断、循环控制等场合,是构建复杂逻辑不可或缺的一部分。掌握好逻辑运算符,不仅可以提高代码的......
  • Java中的构造函数是什么?
    在Java中,构造函数(Constructor)是一种特殊的方法,用于在创建对象时对其进行初始化。构造函数的主要作用是在对象创建时完成初始化操作,确保对象在创建后处于预期的状态。以下是Java中构造函数的一些关键特点和作用:初始化对象状态:构造函数允许在创建对象的同时设置其属性值,确保对......
  • 深入了解Python中的浮点数、自动转换、强制转换与增强赋值运算符
    本套课程在线学习视频https://pan.quark.cn/s/3a470a7bbe67Python是一种强类型语言,具有动态类型和自动内存管理的特性。在数学和科学计算中,浮点数(float)是非常重要的数据类型。本文将详细探讨浮点数的概念、自动转换、强制转换以及增强赋值运算符。通过详细的代码示例和运行结果,帮......
  • MySQL篇(运算符)(持续更新迭代)
    目录一、简介二、运算符使用1.算术运算符1.1.加法运算符1.2.减法运算符1.3.乘法与除法运算符1.4.求模(求余)运算符2.比较运算符2.1.等号运算符2.2.安全等于运算符2.3.不等于运算符2.4.空运算符2.5.非空运算符2.6.最小值运算符2.7.最大值运算符2.8.......
  • 算术运算符和关系运算符
    目录1.算术运算符自增自减2.关系运算符1.算术运算符顾名思义就是用于计算的运算符,将其整理如下:算术表达式运算符含义优先级结合方向例子()括号1自左向右5*(9-3)=30*乘号35*9=45/除号345/9=5%模除(求余)346%9=1+加号......
  • 对象的创建方式:浅拷贝和深拷贝
    对象的创建方式:浅拷贝和深拷贝前言一、值传递和引用传递二、浅拷贝和深拷贝的理解1浅拷贝2.深拷贝三、代码验证和实现3.1浅拷贝的代码实现结果分析3.2深拷贝的代码实现一、实现cloneable接口结果分析实现Cloneable接口并重写方法的缺点二、实现序列化前言今......
  • C++ 派生类赋值运算符应显示调用
    structBase{doublex{111.1};};structDerive:publicBase{doubley{222.2};Derive&operator=(constDerive&obj){if(&obj==this){return*this;}Base::operator=(obj);/......
  • JS 扩展运算符有哪些使用场景?
    你好,我是沐爸,欢迎点赞、收藏、评论和关注。扩展运算符有哪些使用场景?直接进入正题一、复制数组consta1=[1,2];//写法一consta2=[...a1];//写法二const[...a2]=a1;二、合并数组constpart1=[1,2,3];constpart2=[4,5,6];constall=[.......
  • PyCharm修改背景颜色、修改字体大小+Python常用快捷键+Python常见的运算符
    文章目录PyCharm软件的使用1.修改背景颜色和字体大小1.1修改背景颜色1.2修改字体大小2.常用的快捷键3.常见的运算符3.1算术运算符3.2赋值运算符3.3比较运算符3.4逻辑运算符PyCharm软件的使用1.修改背景颜色和字体大小1.1修改背景颜色1.2修改字体大......
  • Js基础之运算符
    比较运算符对比:=单等是赋值==是判断===是全等(要求类型和值都相等)开发中判断是否相等,强烈推荐使用===//比较运算符有隐式转换把'2'转换为2双等号只判断console.log(2=='2')console.log(undefined==null)//===全等判断值和数据类型都一样才行//以后判......