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

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

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

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

0OH28资讯网——每日最新资讯28at.com

1.无参构造函数

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

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

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

2、带参构造函数

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

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

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

3.拷贝构造函数

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

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

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

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

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

4.深拷贝与浅拷贝

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

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

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

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

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

浅拷贝例子:0OH28资讯网——每日最新资讯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指针指向了相同的内存地址。0OH28资讯网——每日最新资讯28at.com

0OH28资讯网——每日最新资讯28at.com

深拷贝例子:0OH28资讯网——每日最新资讯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;}

0OH28资讯网——每日最新资讯28at.com

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

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

5.总结

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

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

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

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

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

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

标签:
  • 热门焦点
  • 三言两语说透柯里化和反柯里化

    三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 猿辅导与新东方的两种“归途”

    猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 年轻人的“职场羞耻感”,无处不在

    年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • iQOO 11S新品发布会

    iQOO 11S新品发布会

    iQOO将在7月4日19:00举行新品发布会,推出杭州亚运会电竞赛事官方用机iQOO 11S。
  •  首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
  • 与兆芯合作  联想推出全新旗舰版笔记本电脑开天N7系列

    与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
  • 上海举办人工智能大会活动,建设人工智能新高地

    上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top
Baidu
map