当前位置:首页 > 科技  > 软件

C++面向对象:深入解析类的构造函数与拷贝控制

来源: 责编: 时间:2024-04-28 17:18:14 280观看
导读C++作为一门强大的编程语言,在面向对象编程(OOP)领域占据着举足轻重的地位。在C++的OOP中,类(Class)是基础,而构造函数和拷贝控制则是实现类实例创建、初始化和复制的核心机制。1.无参构造函数无参构造函数是类的一个特殊成

C++作为一门强大的编程语言,在面向对象编程(OOP)领域占据着举足轻重的地位。在C++的OOP中,类(Class)是基础,而构造函数和拷贝控制则是实现类实例创建、初始化和复制的核心机制。9Y328资讯网——每日最新资讯28at.com

9Y328资讯网——每日最新资讯28at.com

1.无参构造函数

无参构造函数是类的一个特殊成员函数,它在创建类的新对象时被自动调用,用于初始化对象的数据成员。当定义一个类时,如果没有显式定义任何构造函数,编译器会自动生成一个默认的无参构造函数。这个默认构造函数通常执行一些基本的初始化操作。9Y328资讯网——每日最新资讯28at.com

class MyClass {public:    MyClass() {        // 无参构造函数体    }};

在上面的例子中,MyClass是一个类,它有一个无参构造函数。当创建MyClass的实例时,如MyClass obj;,这个无参构造函数将被调用。9Y328资讯网——每日最新资讯28at.com

2、带参构造函数

带参构造函数允许我们在创建对象时传递参数,根据传递的参数初始化对象的数据成员。带参构造函数可以有多个,只要每个构造函数的参数列表不同即可。9Y328资讯网——每日最新资讯28at.com

class MyClass {private:    int value;public:    MyClass(int val) : value(val) {        // 带参构造函数体    }};

在这个例子中,MyClass有一个带参数val的构造函数。当创建对象时,如MyClass obj(10);,传递的参数10将被用来初始化value数据成员。9Y328资讯网——每日最新资讯28at.com

3.拷贝构造函数

拷贝构造函数用于创建一个对象并将其初始化为另一个同类对象的副本。拷贝构造函数通常在以下情况下被调用:9Y328资讯网——每日最新资讯28at.com

  • 当用一个已存在的对象初始化新对象时。
  • 当函数的参数是类对象时,会使用拷贝构造函数传递实参的副本。
  • 当函数的返回值是类对象时,会使用拷贝构造函数复制返回值。

如果程序员没有显式定义拷贝构造函数,编译器会自动生成一个。编译器生成的拷贝构造函数执行的是浅拷贝。9Y328资讯网——每日最新资讯28at.com

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

在上面的例子中,MyClass有一个拷贝构造函数,它通过深拷贝来复制other对象的数据成员。9Y328资讯网——每日最新资讯28at.com

4.深拷贝与浅拷贝

浅拷贝和深拷贝是拷贝构造函数执行的两种不同的复制方式:9Y328资讯网——每日最新资讯28at.com

  • 浅拷贝:简单地复制对象的成员变量,包括指针成员。如果指针成员指向了动态分配的内存,那么浅拷贝会导致两个对象共享同一块内存,可能会引发诸如内存泄漏、数据不一致等问题。
  • 深拷贝:复制对象的所有成员变量,并且复制指针成员指向的动态分配的内存。这样每个对象都有自己的内存副本,避免了上述问题。

在实际应用中,如果类中有指针成员,通常需要自定义拷贝构造函数来实现深拷贝。9Y328资讯网——每日最新资讯28at.com

下面分别给出一个深拷贝和浅拷贝的例子,以便更好地理解这两种拷贝方式的区别。9Y328资讯网——每日最新资讯28at.com

为了展示深拷贝和浅拷贝在内存分配上的不同,打印出拷贝前后对象的内存地址。这样我们可以清楚地看到,浅拷贝会导致两个对象共享相同的内存地址,而深拷贝则会使每个对象拥有自己的内存地址。9Y328资讯网——每日最新资讯28at.com

浅拷贝例子:9Y328资讯网——每日最新资讯28at.com

#include <iostream>class ShallowCopy {public:    int* data;    // 构造函数    ShallowCopy(int val) {        data = new int(val);        std::cout << "原始对象中 data 的地址是: " << data << std::endl;    }    // 拷贝构造函数(浅拷贝)    ShallowCopy(const ShallowCopy& other) {        data = other.data; // 浅拷贝,只是复制了指针地址        std::cout << "浅拷贝对象中 data 的地址是: " << data << std::endl;    }    // 析构函数    ~ShallowCopy() {        //delete data; // 释放内存 如果不注释的话,会被释放两次报错        std::cout << "内存地址 " << data << " 被释放" << std::endl;    }};int main() {    ShallowCopy obj1(10);    ShallowCopy obj2(obj1); // 使用拷贝构造函数进行浅拷贝    return 0;}

在这个例子中,我们打印了原始对象和浅拷贝对象的data指针的内存地址。由于浅拷贝只是复制了指针,所以两个对象的data指针指向了相同的内存地址。9Y328资讯网——每日最新资讯28at.com

9Y328资讯网——每日最新资讯28at.com

深拷贝例子:9Y328资讯网——每日最新资讯28at.com

#include <iostream>class DeepCopy {public:    int* data;    // 构造函数    DeepCopy(int val) {        data = new int(val);        std::cout << "原始对象中 data 的地址是: " << data << std::endl;    }    // 拷贝构造函数(深拷贝)    DeepCopy(const DeepCopy& other) {        data = new int(*other.data); // 深拷贝,复制指针指向的值        std::cout << "深拷贝对象中 data 的地址是: " << data << std::endl;    }    // 析构函数    ~DeepCopy() {        delete data; // 释放内存        std::cout << "内存地址 " << data << " 被释放" << std::endl;    }};int main() {    DeepCopy obj1(10);    DeepCopy obj2(obj1); // 使用拷贝构造函数进行深拷贝    return 0;}

9Y328资讯网——每日最新资讯28at.com

在这个例子中,我们同样打印了原始对象和深拷贝对象的data指针的内存地址。由于深拷贝复制了指针指向的值,并为新的对象分配了新的内存,所以两个对象的data指针指向了不同的内存地址。9Y328资讯网——每日最新资讯28at.com

运行这两个程序,我们可以观察到浅拷贝和深拷贝在内存分配上的不同。在浅拷贝的情况下,两个对象的data指针指向相同的内存地址;而在深拷贝的情况下,每个对象的data指针指向不同的内存地址。9Y328资讯网——每日最新资讯28at.com

5.总结

通过本文的介绍,我们了解了C++中构造函数和拷贝构造函数的作用、特点和性质。构造函数用于初始化对象的数据成员,在对象创建时被调用;而拷贝构造函数则用于创建对象的副本,在对象复制时被调用。9Y328资讯网——每日最新资讯28at.com

在实现拷贝构造函数时,我们需要注意深拷贝和浅拷贝的区别,特别是在处理动态分配内存的情况下,以避免出现内存泄漏和悬挂指针等问题。9Y328资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-86203-0.htmlC++面向对象:深入解析类的构造函数与拷贝控制

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C#中JSON处理的综合指南

下一篇: C#控制台应用程序与窗口关闭事件

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
Top