首页 > 编程语言 >【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)

【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)

时间:2024-01-22 19:05:34浏览次数:22  
标签:const 入门 函数 C++ 运算符 重载 拷贝 构造函数

【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)_赋值

【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)_成员函数_02编辑

一、前言

二、拷贝构造函数

⭕拷贝构造函数概念

⭕拷贝构造函数的特点

⭕拷贝构造函数的几种类型

三、赋值运算符重载

⭕运算符重载概念

⭕赋值运算符重载

⭕前置++和后置++重载

四、const成员函数

⭕const成员函数概念

⭕常量成员函数需要满足的特点

⭕常量成员函数有利条件

⭕const常量的几个常见问题

五、取地址(&)及(const &)操作符重载

六、总结


一、前言

这里有上篇链接)前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数。也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点——类和对象(拷贝构造函数、赋值运算符重载、const成员、取地址及const取地址操作符重载)。下面话不多说坐稳扶好咱们要开车了。

【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)_成员函数_03

【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)_拷贝构造函数_04编辑

二、拷贝构造函数

⭕拷贝构造函数概念

        拷贝构造函数是C++中的一个特殊成员函数,用于创建对象的副本。它的作用是通过使用已有对象的属性值来初始化新对象,实现对象的复制操作。通过定义拷贝构造函数,我们可以控制对象的拷贝过程,并确保正确处理含有指针或动态分配内存的类。

拷贝构造函数的定义形式如下:

类名(const 类名& 对象名)
{
    // 构造函数的主体部分
    // 将对象的属性值拷贝到新对象
}

【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)_拷贝构造函数_05

 ⭕拷贝构造函数的特点

        拷贝构造函数在C++中具有自动调用、形参类型为const引用、逐一复制对象成员、隐式调用与显式调用、需要自定义情况等特点下面我会按顺序逐一分析:

        1. 自动调用:拷贝构造函数会在特定场景下自动调用,例如对象的初始化、对象作为参数传递给函数、函数返回对象等情况。无需显式调用,编译器会根据需要自动选择合适的拷贝构造函数进行调用。

        2. 形参类型为const引用:拷贝构造函数的参数类型通常是一个常引用(const引用),即“ const类名& 对象名 ”。这是为了避免修改原对象的属性值,保证在拷贝过程中原对象不会被修改

        3. 对象的成员逐一复制:拷贝构造函数会将原对象的属性值通过复制或拷贝的方式赋值给新对象的相应属性。对于基本数据类型的成员变量,会直接进行值的复制;对于对象类型的成员变量,会调用该对象的拷贝构造函数进行复制。

        4. 隐式调用与显式调用:在大多数情况下,拷贝构造函数会由编译器隐式调用,无需手动编写代码。然而,在某些特殊情况下,需要显式地调用拷贝构造函数,例如通过拷贝构造函数初始化新对象、创建对象数组、创建对象的副本等。

        5. 需要自定义情况当类中存在指针成员、动态分配的内存或资源时,通常需要自己定义拷贝构造函数。这是因为默认的拷贝构造函数只进行浅拷贝,即简单地复制指针成员的值,而不会复制指针所指向的内存。因此,需要手动编写拷贝构造函数来进行深拷贝,确保新对象和原对象具有独立的内存空间

        6. 只针对同类对象拷贝构造函数只能用于同类对象之间的拷贝,无法用于不同类之间的对象拷贝。如果需要实现类之间的对象拷贝,可以使用转换构造函数或赋值运算符重载等方式。

        掌握拷贝构造函数的特点有助于正确地实现对象的复制操作,并解决潜在的问题。

⭕拷贝构造函数的几种类型

        C++中常见的拷贝构造函数的几种类型包括:默认拷贝构造函数自定义浅拷贝拷贝构造函数以及自定义深拷贝拷贝构造函数

        1. 默认拷贝构造函数:如果没有显式定义拷贝构造函数,编译器会自动生成默认的拷贝构造函数。默认拷贝构造函数执行的是逐一复制成员的操作,即将原对象的每个成员属性的值赋值给新对象的对应成员属性。然而,如果类中存在指针成员、动态分配的内存或资源,该默认拷贝构造函数通常不能满足需求,可能会导致浅拷贝问题。

        2. 自定义浅拷贝拷贝构造函数:自定义浅拷贝拷贝构造函数会简单地复制原对象的成员属性的值给新对象的对应成员属性。这种拷贝构造函数适用于对象中没有指针、动态分配的内存或资源的情况,因为它不会进行深拷贝。(更多的介绍在这里

        3. 自定义深拷贝拷贝构造函数:在类中存在指针成员、动态分配的内存或资源时,需要自定义拷贝构造函数来进行深拷贝。自定义深拷贝拷贝构造函数会为新对象的指针成员分配独立的内存,并将原对象的指针指向的内容复制到新对象中,确保对象的独立性和数据完整性。(更多的介绍在这里

下面这段代码,展示了一个具有指针成员的类的自定义深拷贝拷贝构造函数:

class MyClass {
private:
    int* data;
public:
    // 自定义深拷贝拷贝构造函数
    MyClass(const MyClass& other) {
        data = new int;
        *data = *(other.data);
    }
    // ...
};

【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)_拷贝构造函数_06

        在上面的代码中,自定义的拷贝构造函数通过new操作符为新对象的指针成员分配独立的内存,并将原对象的指针指向的值复制到了新对象中,实现了深拷贝。

        需要根据类的具体情况来选择是否需要自定义拷贝构造函数,并根据类中是否存在指针、动态分配的内存或资源来决定是否需要进行深拷贝。

        总的来说,根据类中成员的特点和需求,选择合适的拷贝构造函数类型,确保对象的复制操作正确、高效地执行。拷贝构造函数在C++中有诸多优点,它们使得对象的复制、传递和返回更加方便和安全。通过合理定义和使用拷贝构造函数,可以提高代码的可维护性和可读性,避免资源冲突和问题的发生,并使得程序的设计更加灵活和优雅。

三、赋值运算符重载

⭕运算符重载概念

        在C++中,运算符重载(Operator Overloading)是一种特性,允许程序员重新定义或重新定义运算符的操作行为。运算符重载允许我们使用相同的运算符来执行不同类型的操作,使得代码更加简洁、直观和易于理解。

        通过运算符重载,我们可以为用户自定义的类、枚举类型以及内置的数据类型(如整数、浮点数等)定义运算符的行为。这就意味着我们可以使用常规运算符(如"+", "-", "*", "/"等)来操作自定义类型的对象,以及在自定义类型之间实现特定的运算。

标签:const,入门,函数,C++,运算符,重载,拷贝,构造函数
From: https://blog.51cto.com/u_16531685/9368951

相关文章

  • 【C++进阶】function和bind及可变模板参数
     文章目录1.function和bind1.1function使用方法1.2bind2.可变模板参数2.1可变模板参数函数2.2可变模板参数的展开 1.function和bindC++中的function和bind是为了更方便地进行函数对象的封装和调用而设计的。function是一个通用的函数对象容器......
  • 【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名
     目录一、初始化列表⭕初始化列表概念⭕初始化列表的优点⭕使用场景⭕explicit关键字二、Static成员⭕Static成员概念......
  • python自动化测试学习路线(从入门到精通)
    python自动化测试学习路线(从入门到精通)一、Python的应用场景Python用于简单脚本编程,如编写2048小游戏或12306的自动抢票软件;Python用于系统编程,如开发系统应用;Python用于开发网络爬虫;网络爬虫的用途是进行数据采集,也就是将互联网中的数据采集过来。网络爬虫的难点其......
  • 测试开发技术:Python测试框架Pytest的基础入门
    测试开发技术:Python测试框架Pytest的基础入门  Pytest简介Pytestisamaturefull-featuredPythontestingtoolthathelpsyouwritebetterprograms.Thepytestframeworkmakesiteasytowritesmalltests,yetscalestosupportcomplexfunctionaltesting......
  • 【赛后反思】【LGR-172-Div.4】洛谷入门赛 #19 赛后反思
    【LGR-172-Div.4】洛谷入门赛#19赛后反思今日推歌:Cagayake《無名のエヌ(feat.重音テト&可不)》不正解だ不正解だった中途半端な身体は不是很火的一首歌,连个翻译都没有(悲Before最后5minAK了,第一次AK,虽然是入门赛但还是很有成就感的:省流:STL大胜利A分饼干I......
  • 4147:汉诺塔问题(Tower of Hanoi)C++
    递归C和C++一样,就写个C++了。#include<iostream>usingnamespacestd;voidmove(intn,chara,charb,charc){if(n<=0)return;move(n-1,a,c,b);cout<<n<<":"<<a<<"->"<<c<<'\n�......
  • C++中lambda与priority_queue一起使用
    想写这篇博客的原因是在刷力扣的347.前K个高频元素一题时,需要使用到优先队列priority_queue,其定义如下:template<classT,classContainer=std::vector<T>,classCompare=std::less<typenameContainer::value_type>>classpriority_queue;第三个参数......
  • C++内联函数
    什么是内联函数以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。为什么存在内联函数我们知道,普通的函数需要建立栈帧空间因此,可以利用宏来定义一些小的函数(行数较少的)这样,函数调用的时候......
  • C++U6-03-最短路算法4-floyd算法
    B站复习视频:1、https://www.bilibili.com/video/BV1Fj411d71S/?spm_id_from=333.999.0.02、https://www.bilibili.com/video/BV1RK4y1d7ct?p=1&vd_source=5c960e1ede940bc5cab8ed42c8bdc937学习目标 floyd算法Floyd算法是一种用于找到图中所有节点对之间最短路径的动态规划......
  • 一篇简短的文章把C++左右值关系讲的透透彻彻
     目录前言C++左值和右值二、右值引用二、右值引用 前言对于C++的左值和右值相信很多人都没有一个很透彻的了解,之前我也是不懂的时候查阅了好多文章,但是讲完我还是一头雾水,直到我遇到一篇宝藏文章,讲的左值右值的关系以及Move函数的用法是相当的清楚,文章链接......