首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 赋值运算符=的重载(浅拷贝、深拷贝)

比如:把一个 int 类型变量赋值给一个 Complex(复数)对象,或把一个 char* 类型的字符串赋值给一个字符串对象,此时就需要重载 = 赋值运算符 。...需要注意的是:赋值运算符 = 只能重载为成员函数。 ---- — 2 — 举个栗子 下面我们以自定义一个自己的字符串类代码的例子,讲解赋值运算符的重载函数。...MyString 字符串类所需的成员函数: 构造函数 / 析构函数 返回 char* 指针的函数 赋值运算符重载函数 ?...当我们重载一个运算符的时候,好的风格应该是尽量保留运算符原本的特性。 考虑: a = b = c; 这个赋值语句的顺序是先 b = c ,然后在 a = (b = c) 。...赋值运算符重载函数(深拷贝) 复制构造函数(深拷贝) ?

2.3K41

【C++】运算符重载 ② ( 类内部定义云算符重载 - 成员函数 | 类外部定义运算符重载 - 全局函数 | 可重载的运算符 )

一、运算符重载本质 运算符重载的本质是 " 函数调用 " ; 当使用 + 将 个对象相加时 , C++ 编译器会查找是否有定义运算符重载函数 ; // 自定义类型相加 Student s1(10,..., 可以使用函数形式调用 , 也可以使用运算符进行运算 , 其 本质还是类的函数调用 ; 2、运算符重载函数调用 重载运算符完整调用 , 即调用上面定义的整个 operator+ 方法 , 这是采用正式的的函数调用方式...o3; } 2、运算符重载函数调用 已重载的运算符调用 , 可以直接调用运算符重载的 operator*() 方法 , 也可以直接使用运算符 , o1 * o2 ; //运算符重载 //注意这里的...: " << o6.number << endl; 代码执行结果 外部定义的运算符重载完整写法结果 : 800 外部定义的运算符重载简化写法结果 : 800 四、可重载的运算符 ---- 这里列举一下可重载的运算符...运算符的类型 列举该类型下的所有可重载的运算符 比较运算符 ( 双目运算符 ) == (等于) , !

26010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    高效的使用stl::map和std::set

    1、低效率的用法 // 先查找是否存在,如果不存在,则插入 if (map.find(X) == map::end()) // 需要find一次 {     map.insert(x); // 需要find...; // 需要find一次 // 对于erase存在同样低效的用法 if (map.count(X) > 0) // 需要find一次 {     map.erase(X); // 需要find一次 }...else {     // 不存在时的处理 } 2、高效率的用法 // 解决办法,充分利用insert和erase的返回值,将find次数降为1 map::size_type num_erased =...map.erase(X); // 需要find一次 if (0 == num_erased) {     // 不存在时的处理 } else {     // 存在且删除后的处理 } pair result_inserted...; result_inserted = map.insert(X); if (result_inserted.second) {     // 不存在,插入成功后的处理 } else {     //

    2.9K20

    C++(运算符重载+赋值拷贝函数+日期类的书写)

    运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。..._day; } 上面说完运算符重载接下来来讨论一下赋值拷贝函数 由于赋值操作我们改变的是调用这个函数的对象,所以我们在参数中可以加上cosnt修饰,传值和传引用,我们选择传引用,最后返回也返回引用,这样可以避免调用拷贝构造函数...用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注 意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符 重载完成赋值。..._day; return in; } 这里加入了返回值之后,就可以进行连续的流插入和流提取了 总结 在本文中,我们深入探讨了运算符重载和赋值拷贝函数在C++中的应用。...通过深入理解和熟练应用这些概念,我们可以写出更加健壮和高效的代码。 在实践中,我们需要注意运算符重载和赋值拷贝函数的使用场景和规范,以避免潜在的错误和性能问题。

    7610

    【C++干货基地】特殊函数名的函数:赋值运算符重载

    一、运算符重载 C++ 中为了增加代码的可读性运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...** 1.1 == 运算符重载 下面我们就来实践一下再日期类中 == 运算符如何重载, 以往我们在 内置类型 == 运算符返回的都是bool 类型 这样的话返回类型就确定了 运算符重载 的关键字是 operator...2.1 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this...内置类型我们都知道是从后往前连续赋值的 也就是 10 先赋值给 b 然后 b 在赋值给 a,而我们并没有给赋值运算符重载返回一个值所以 就提示我们 二元 “=” 运算符没有找到与它匹配的操作数 所以我们的返回值就必须是...而我们的后置++ 返回的是++之前的值先使用在++所以需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给this+1 后置++: 前置++和后置++都是一元运算符,为了让前置++与后置

    6700

    类的成员函数(构造、析构、拷贝构造、赋值、运算符重载)的实现

    以String类为例实现其成员函数 class String { //友元函数重载运算符 friend ostream& operator<<(ostream &out,String& str);...String& operator=(const String &str) //输入参数为const型 { if (this == &str) //检查自赋值 return *this;...strlen(str.m_data); m_data = new char[length + 1]; strcpy(m_data, str.m_data); return *this; //返回本对象的引用.../*如果是双目运算符,只要设置一个参数作为右侧运算量,左侧运算符就是对象this本身 *但是>>或运算符是cin或cout而不是对象本身,只能声明为友元了 *如果一定要声明为成员函数,只能声明为...ostream & operator<<(ostream &output) *在运用这个运算符时就变为这种形式了:data的习惯。

    1.1K60

    【C++】揭秘类与对象的内在机制(核心卷之运算符重载、赋值重载与取址重载的奥秘)

    ,也就是上面的第7点,至少要有一方是类类型,否则会报错,那么我们就结合运算符重载的规则写一写内置类型的运算符重载,如下: #include using namespace std...    那么接下来我们知道了上面的知识,就可以真正来实现一个日期类的运算符重载了,这里我们选择日期类的相等运算符重载(不是赋值),我们来分析分析它的返回值和参数     首先返回值肯定是bool...,否则不相等,那么我们接下来就按照这个思路来自己实现一下日期类的相等运算符重载,如下: #include using namespace std; class Date {...,直接换成了使用相等运算符的方式,我们看看代码是成功运行还是报错,如下:     可以代码居然成功运行了,效果和我们使用成员函数调用方式一样,没错,只要是我们重载的运算符,我们都可以按照原本运算符的方式直接使用...二、赋值重载     赋值重载函数也是一个类的默认成员函数,因为当我们不写赋值重载时,编译器会默认生成一个赋值重载给我们使用,在这个部分我们除了要搞清楚赋值重载的作用和写法,我们还要和拷贝构造以及相等运算符重载作区分

    7410

    使用Map批量赋值进行表单验证的实践

    通过使用Map批量赋值功能,我们可以更高效地将表单数据批量赋值给验证对象,然后根据验证对象的属性进行验证。一、Map批量赋值功能概述Map批量赋值功能是一种将数据从一个对象映射到另一个对象的方法。...二、使用Map批量赋值进行表单验证通过使用Map批量赋值功能,我们可以将表单数据批量赋值给验证对象。具体步骤如下:1. 定义一个包含表单数据和验证规则的Map对象;2....将用户提交的表单数据转换为Map对象;3. 使用Map批量赋值功能,将表单数据的键值对批量赋值给验证对象;4. 根据验证对象的属性进行验证;5. 根据验证结果返回相应的提示信息。...三、优势与效果使用Map批量赋值进行表单验证的优势在于:1. 提高开发效率:通过批量赋值,避免了手动为每个字段设置验证规则的繁琐过程;2....四、结论通过使用Map批量赋值功能,我们可以更高效、灵活地进行表单验证。它减少了开发时间和维护成本,提高了开发效率和代码的可维护性。

    29810

    C++新旅程:类的拷贝构造函数 、赋值运算符重载 和const成员函数

    赋值运算符重载在了解赋值重载函数之前,我们需要了解什么是运算符重载,这里做一个简单的介绍。...C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...2.0运算符重载函数(1)函数名:operator+需要重载的运算符符号(2)函数原型:返回值类型 operator+符号(形参参数列表)(3)必须有一个类类型的参数(4)简单代码示例2.1概念赋值重载...此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。...2.2赋值运算符重载格式返回值类型:类名&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值参数类型:const 类名&(传引用提高效率)返回*this(要符合连续赋值的含义)检测是否自己给自己赋值

    8210

    Java赋值运算符的使用技巧,你Get了吗?

    前言  在Java开发中,赋值运算符是一种常用的运算符,用于给变量赋值。在实际工作中,我们经常需要对变量进行赋值操作,因此掌握赋值运算符的使用技巧是非常重要的。  ...本文将对Java赋值运算符进行详细的解析,包括其基本语法,应用场景案例,优缺点分析等。希望能够帮助读者更好地掌握Java赋值运算符的使用方法。摘要  赋值运算符是一种常用的运算符,用于给变量赋值。...然后,使用赋值运算符将 b 的值赋给 a。最后,我们使用一系列复合赋值运算符对 a 进行操作,并将结果输出到控制台。   需要注意的是,Java中的赋值运算符和C++中的赋值运算符是不同的。...使用赋值运算符可以让Java程序更加简洁、高效,提高代码的可读性和可维护性。  然而,赋值运算符的不当使用也会导致一些潜在的问题。...例如,如果使用复合赋值运算符,可能会导致代码的可读性降低;如果使用赋值运算符时,左右操作数的类型不一致,可能会导致类型转换错误,从而引发异常。

    29751

    C++11 语法特性:auto 与范围 for 循环详解

    // 使用赋值运算符重载(深拷贝) return 0; } 3.5 代码分析 在这个实现中,拷贝构造函数和赋值运算符重载都通过深拷贝来确保每个对象管理独立的内存空间,避免了重复释放同一内存的错误...五法则是在三法则的基础上,增加了移动构造函数和移动赋值运算符重载。 4.1 什么是五法则?...五法则指出,如果你的类管理动态资源,不仅需要实现三法则中的析构函数、拷贝构造函数和赋值运算符重载,还应当实现移动构造函数和移动赋值运算符重载,以支持移动语义。...String s3; s3 = std::move(s2); // 移动赋值,s2 的资源被转移给 s3 return 0; } 4.4 代码分析 在该示例中,我们添加了移动构造函数和移动赋值运算符重载...,并且使用 std::move() 将对象的资源转移给新对象。

    20110

    九、运算符重载

    可重载与不可重载的运算符 可重载的运算符: 大多数C++中的运算符都可以被重载,包括算术运算符(如+、-、*、/)、关系运算符(如、==)、逻辑运算符(如&&、||、!...赋值运算符(=):虽然赋值运算符是算术运算符之一,但其重载有特定的要求和规则(例如,防止自赋值和确保返回值类型为对象的引用),需要特别注意。...但是,你应该谨慎使用类型转换操作符,并确保它们的行为是清晰和可预测的。 赋值运算符重载 在C++中,赋值运算符(=)的重载允许你为自定义类型(如类)定义赋值的行为。...当你尝试将一个对象赋值给另一个同类型的对象时,如果没有显式地重载赋值运算符,编译器将使用默认的赋值行为,这通常包括成员对成员的赋值(浅拷贝)。...重载赋值运算符时,需要注意以下几个关键点: 返回值:重载的赋值运算符应该返回对当前对象的引用(T&),这允许连续赋值。 自赋值检查:确保赋值操作不会将对象赋值给其自身。

    16110

    《C++Primer》第十四章 重载运算与类型转换

    :这四个运算符是不能被重载的 使用重载的运算符本质上是一次函数调用,关于运算对象求值顺序和短路求值属性无法保留下来,因此不建议重载逻辑与/或运算符和逗号运算符 C++定义了逗号运算符和取地址运算符用于类类型对象时的特殊含义...,操作完成后返回该局部变量的副本作为结果 如果类同时定义了算术运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋值来实现算术运算符 1....=的,那么一个对象应该<另一个 赋值运算符 我们之前定义过拷贝赋值和移动赋值运算符,它们可以把类的一个对象赋值给该类的另一个对象。类还可以定义其他赋值运算符使用别的类作为右侧运算对象。...,复合赋值运算符通常情况下也应该这么做,这两类运算符都应该返回左侧运算对象的引用。...与下标的原始定义兼容,我们需要确保: 下表运算符通常以所访问元素的引用作为返回值,这样下标可以出现在赋值运算符的任意一端 最好定义下标运算符的常量和非常量版本,当作用于一个常量对象时下标运算符返回常量引用以确保我们不会给返回的对象赋值

    92910

    【笔记】《C++Primer》—— 第14章:重载运算和类型转换

    14.1 基本概念 运算符重载在13章中提到过一点点,重载的运算符实际上是具有特殊名字能被特殊调用的函数 重载运算符的名字由 operator运算符 组成,和普通的函数一样,重载运算符函数也需要自己的返回值...我们可以像普通的运算符一样使用重载的运算符,也可以像普通的函数一样使用重载运算符函数,当这个函数是成员函数时,我们也可以像使用普通的成员函数一样使用它 重载运算符的本质是函数调用,因此向逻辑运算符,逗号运算符之类的运算符内在的短路求值特性等将被舍弃...,一般也会定义复合赋值运算符,此时一般使用复合赋值运算符来定义普通的算术运算符(也就是让普通的算术运算符通过包装复合赋值运算符来实现) 相等运算符的一般语义是比较类的每一个数据成员的值,当全部相等时才标识相等...,用于让其他类型作为右侧对象,返回一个当前类型的引用 不论形参是什么,赋值运算符都必须定义为成员函数 复合赋值运算符不是非得是成员函数,但是我们也倾向于定义为成员函数 赋值运算符的参数一般都是const...,而是包装解引用运算符 重载的箭头运算符有要求必须返回类的指针或者某个对象,但是解引用运算符没有要求 14.8 函数调用运算符 重载函数调用运算符让我们可以像使用函数一样使用类的对象,这样的类由于能有自己的状态所以比普通的函数更加灵活

    66610

    剖析【C++】——类与对象(中)——小白篇—超详解

    函数返回值类型为类类型对象。 为了提高程序效率,一般对象传参时尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。 总结 拷贝构造函数是用于创建一个与已有对象相同的新对象的特殊构造函数。...以下是对赋值运算符重载的详细解释和代码示例,帮助初学者深入理解其原理和使用方法。 5.1 运算符重载概述 运算符重载是C++引入的一种机制,用于增强代码的可读性。...运算符重载的函数具有特殊的名字,并且具有返回值类型、函数名字以及参数列表,其返回值类型和参数列表与普通的函数类似。函数名字为关键字 operator 后面接需要重载的运算符符号。...示例:运算符重载函数原型 5.2 赋值运算符重载 赋值运算符重载是一种常见的运算符重载形式,用于定义类对象之间的赋值操作。 赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率。...例如: Date date2 = date1; // 调用拷贝构造函数 2.3 赋值运算符重载 赋值运算符重载用于定义对象之间的赋值操作。它返回一个对当前对象的引用,以支持连续赋值。

    12410

    两万字总结《C++ Primer》要点

    类型 备注 map 关联数组,保存关键字-值对 set 值保存关键字的容器 multimap 关键字可重复出现的map multiset 关键字可重复出现的set unordered_map 用哈希函数组织的...(2)拷贝赋值运算符 重载赋值运算符:oprator= 合成拷贝赋值运算符:若一个类未定义自己的拷贝赋值运算符,编译器会为它生成一个合成拷贝赋值运算符。...第十四章 重载运算与类型转换 P490-P523 通过运算符重载可重新定义该运算符的含义。 14.1 基本概念 定义:重载运算符是具有特殊名字的函数。名字由operator和符号组成。...重载运算符包含返回类型、参数列表和函数体。 ::: tip 当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的显式参数数量比运算对象的数量少一个。...如果我们想拷贝(或移动)基类部分,则必须在派生类的构造函数初始值列表中显式的使用基类的拷贝(或移动)构造函数。 ::: 派生类的赋值运算符: 派生类的赋值运算符必须显式的为其基类部分赋值。

    2.1K30

    两万字总结《C++ Primer》要点

    类型 备注 map 关联数组,保存关键字-值对 set 值保存关键字的容器 multimap 关键字可重复出现的map multiset 关键字可重复出现的set unordered_map 用哈希函数组织的...(2)拷贝赋值运算符 重载赋值运算符:oprator= 合成拷贝赋值运算符:若一个类未定义自己的拷贝赋值运算符,编译器会为它生成一个合成拷贝赋值运算符。...第十四章 重载运算与类型转换 P490-P523 通过运算符重载可重新定义该运算符的含义。 14.1 基本概念 定义:重载运算符是具有特殊名字的函数。名字由operator和符号组成。...重载运算符包含返回类型、参数列表和函数体。 ::: tip 当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的显式参数数量比运算对象的数量少一个。...如果我们想拷贝(或移动)基类部分,则必须在派生类的构造函数初始值列表中显式的使用基类的拷贝(或移动)构造函数。 ::: 派生类的赋值运算符: 派生类的赋值运算符必须显式的为其基类部分赋值。

    1.8K20

    【C++】运算符重载 ⑨ ( 等号 = 运算符重载 | 调用默认浅拷贝构造函数的情况分析 | 等号 = 运算符重载 与 拷贝构造函数 各自使用场景 | 等号 = 操作符重载步骤 )

    博客总结 : 使用 成员函数 进行 等号运算符重载 函数原型如下 : Student& operator=(Student& s) 使用 已存在的对象 A 对 另外一个已存在对象 B 赋值 , B =...Student 实例对象 Student s(18, "Tom"); // 声明 Student 对象 s2 , 并使用 s 为 s2 赋值 // 该操作会调用 默认的拷贝构造函数 //...进行拓展分析 ; 实现了 深拷贝构造函数 后 , 再次使用一个对象为另一个对象赋值时 , 如 Student s2 = s; 代码 , 就会自动调用 深拷贝构造函数 ; 2、等号 = 运算符重载 与...拷贝构造函数 各自使用场景 等号 = 运算符重载 与 拷贝构造函数 各自使用场景 : 拷贝构造函数 : 如果 使用对象 为一个 新对象 进行初始化 , 调用的是拷贝构造函数 ; 等号 = 运算符重载 :...如果 使用对象 为一个已存在的对象 重新进行赋值 , 调用的是 等号运算符 的 重载运算符方法 ; 3、= 操作符重载步骤 使用 成员函数 实现 等号 = 运算符重载 : 首先 , 写出函数名 , Student

    27620

    【C++篇】C++类与对象深度解析(三):类的默认成员函数详解

    运算符重载基本概念 4.1 运算符重载的基本概念 运算符重载允许我们为类对象自定义运算符的行为,这样当我们对类对象使用这些运算符时,它们会按照我们定义的方式执行。...示例:重载前置和后置递增运算符 前置直接操作对象,传引用返回,而后置返回副本,用传值返回 #include using namespace std; class Number {...5.2 有返回值,建议写成当前类类型的引用 赋值运算符重载函数通常返回当前对象的引用,这样可以安全支持链式赋值操作,即多个对象之间连续赋值的语句。...示例:使用编译器生成的默认赋值运算符 #include using namespace std; class MyClass { public: MyClass(int value...它同样可以控制是否返回const对象的真实地址或者伪装地址。 总结 默认行为:在大多数情况下,编译器自动生成的取地址运算符已经足够使用,不需要手动重载。

    12610

    【C++篇】C++类与对象深度解析(三):类的默认成员函数讲解

    运算符重载基本概念 4.1 运算符重载的基本概念 运算符重载允许我们为类对象自定义运算符的行为,这样当我们对类对象使用这些运算符时,它们会按照我们定义的方式执行。...4.2 重载运算符的规则 函数的名字:重载的函数名称必须是operator加上运算符,例如operator+、operator==。 参数和返回类型:重载的运算符函数需要根据需要设置参数和返回类型。...———————————————— 5.2 有返回值,建议写成当前类类型的引用 赋值运算符重载函数通常返回当前对象的引用,这样可以安全支持链式赋值操作,即多个对象之间连续赋值的语句。...示例:使用编译器生成的默认赋值运算符 #include using namespace std; class MyClass { public: MyClass(int value...它同样可以控制是否返回const对象的真实地址或者伪装地址。 总结 默认行为:在大多数情况下,编译器自动生成的取地址运算符已经足够使用,不需要手动重载。

    6400
    领券