C++创建并初始化对象

news2024/11/15 13:57:00

文章目录

      • 一、对象的创建
        • 1.1 定义类
        • 1.2 创建对象
      • 二、对象的初始化
        • 2.1 默认构造函数
        • 2.2 带参数的构造函数
        • 2.3 初始化列表
      • 三、拷贝构造函数
      • 四、对象的销毁
      • 五、总结
    • 视频讲解笔记
      • 在栈上创建
      • 在堆上创建
        • new

在C++中,创建并初始化对象是面向对象编程(OOP)的核心操作之一。对象的创建与初始化主要通过类和构造函数来完成。以下是关于C++中对象的创建和初始化的详细教学。

一、对象的创建

1.1 定义类

在创建对象之前,首先需要定义一个类。类是对象的蓝图,定义了对象的属性和行为。类通常包含成员变量(属性)和成员函数(方法)。

示例:

class Person {
public:
    string name;
    int age;

    void display() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

在这个示例中,Person类包含两个成员变量nameage,以及一个成员函数display()用于显示对象的信息。

1.2 创建对象

创建对象的过程称为“实例化”。实例化是指通过类的定义创建一个类的对象。对象的创建可以在栈上或堆上进行。

栈上创建对象:

int main() {
    Person p1;  // 创建一个 Person 对象
    p1.name = "John";
    p1.age = 30;
    p1.display();  // 输出: Name: John, Age: 30
    return 0;
}

堆上创建对象:

int main() {
    Person* p2 = new Person;  // 在堆上创建一个 Person 对象
    p2->name = "Alice";
    p2->age = 25;
    p2->display();  // 输出: Name: Alice, Age: 25
    delete p2;  // 手动释放堆上的内存
    return 0;
}

在栈上创建的对象在作用域结束时自动销毁,而在堆上创建的对象则需要手动释放内存。

二、对象的初始化

对象的初始化可以通过构造函数来实现。构造函数是类的一种特殊成员函数,用于在对象创建时对其进行初始化。

2.1 默认构造函数

如果类中没有显式定义构造函数,编译器会自动生成一个默认构造函数。默认构造函数不接受参数,通常用于简单的对象初始化。

示例:

class Person {
public:
    string name;
    int age;

    Person() {
        name = "Unknown";
        age = 0;
    }

    void display() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    Person p1;  // 调用默认构造函数
    p1.display();  // 输出: Name: Unknown, Age: 0
    return 0;
}

在这个示例中,Person类定义了一个默认构造函数,该构造函数将name初始化为"Unknown",将age初始化为0

2.2 带参数的构造函数

带参数的构造函数允许在创建对象时传递参数,以便对对象进行更灵活的初始化。

示例:

class Person {
public:
    string name;
    int age;

    Person(string n, int a) {
        name = n;
        age = a;
    }

    void display() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    Person p1("John", 30);  // 调用带参数的构造函数
    p1.display();  // 输出: Name: John, Age: 30
    return 0;
}

在这个示例中,Person类的构造函数接受两个参数,并将它们用于初始化nameage

2.3 初始化列表

C++提供了初始化列表(Initializer List),用于在构造函数中直接初始化成员变量。初始化列表比在构造函数体内进行赋值更高效,尤其对于常量成员和引用成员来说是唯一的初始化方式。

示例:

class Person {
public:
    string name;
    int age;

    Person(string n, int a) : name(n), age(a) {}  // 使用初始化列表

    void display() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    Person p1("Alice", 25);
    p1.display();  // 输出: Name: Alice, Age: 25
    return 0;
}

在这个示例中,Person类的构造函数使用了初始化列表,这样做不仅简洁,而且避免了在构造函数体内进行额外的赋值操作。

三、拷贝构造函数

当一个对象被用作另一个对象的初始值或被传递给函数时,会调用拷贝构造函数。拷贝构造函数用于创建对象的副本。

示例:

class Person {
public:
    string name;
    int age;

    Person(string n, int a) : name(n), age(a) {}

    // 拷贝构造函数
    Person(const Person &p) {
        name = p.name;
        age = p.age;
    }

    void display() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    Person p1("John", 30);
    Person p2 = p1;  // 调用拷贝构造函数
    p2.display();  // 输出: Name: John, Age: 30
    return 0;
}

在这个示例中,Person类定义了一个拷贝构造函数。当创建对象p2时,调用拷贝构造函数将p1的值复制给p2

四、对象的销毁

对象的销毁是由析构函数完成的。析构函数用于释放对象在生存期内分配的资源。析构函数是一个没有返回值、没有参数、名称与类名相同并前置~符号的特殊成员函数。

示例:

class Person {
public:
    string name;
    int age;

    Person(string n, int a) : name(n), age(a) {}

    ~Person() {
        cout << name << " is being destroyed" << endl;
    }
};

int main() {
    Person p1("John", 30);
    return 0;  // 当 p1 超出作用域时,自动调用析构函数
}

在这个示例中,当p1超出作用域时,自动调用析构函数,输出信息表明对象正在被销毁。

五、总结

  • 对象的创建:可以在栈上或堆上创建对象,通过类的定义实例化对象。
  • 对象的初始化:主要通过构造函数完成,包括默认构造函数、带参数的构造函数和使用初始化列表。
  • 拷贝构造函数:用于创建对象的副本,在需要复制对象时调用。
  • 对象的销毁:由析构函数完成,用于释放资源。

掌握对象的创建和初始化是理解和使用C++面向对象编程的基础。通过合理地设计构造函数和析构函数,可以有效地管理对象的生命周期和资源的使用。

视频讲解笔记

创建并初始化C++ 对象,有两种方式:
1、如果你想手动控制它的创建和释放,以及需要的内存比较大,就在堆上创建,使用new,对应的需要delete,否则会出现内存泄漏;

2、栈上一般1–2M的内存,比较小,当时性能比堆上快,会在自己的作用域结束后自动释放。

在栈上创建

默认构造函数,已经初始化,不会有空指针异常。
在这里插入图片描述

在这里插入图片描述

在堆上创建

在这里插入图片描述

new

new,寻找一块连续的内存,然后把地址返回,所以创建时是:

Entity *e = new Entity();
寻找连续的地址也是根据空闲列表寻找,并不是逐行遍历那么笨拙;

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于yolov8的驾驶员行为检测疲劳检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的驾驶员行为检测疲劳检测系统是一种创新的驾驶安全解决方案。该系统利用YOLOv8这一先进的目标检测算法&#xff0c;结合驾驶员疲劳驾驶数据集&#xff0c;能够实时、准确地监测并分析驾驶员的面部表情和行为模式&#xff0c;从而快速识别疲劳状态。 …

关于分布式数据库缓存设计的那点事和实践

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(8 分) 【问题 3】(8 分) 【答案】 【问题 1】答案 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于分布式数据库缓存设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某企业是为城市高…

【网络协议】精讲OSI七层模型、TCP/IP四层、五层模型区别!图解超赞超详细!!!

目录 1. OSI与TCP/IP模型的网络协议层次结构差异 1.1 OSI模型的七层结构 1.2 TCP/IP模型的四层结构 1.3 TCP/IP模型的五层结构 2. OSI七层模型和TCP/IP协议模型的区别 2.1 区别总结&#xff1a; 3. 网络协议分层的优点 1. OSI与TCP/IP模型的网络协议层次结构差异 协议分…

拥抱开源拥护国产|暴雨打造最强AI的服务器操作系统!

8月30日&#xff0c;主题为“进化重构赴未来”的2024龙蜥操作系统大会(OpenAnolis Conference)在北京举办。龙蜥社区作为国内领先的开源操作系统根社区&#xff0c;推出的Anolis OS及衍生版装机量已突破800万套&#xff0c;实现了从开源到商业化的良性循环发展。 2024 龙蜥操作…

【惊天BUG】select * from 表 where value = 0;查询结果让大师兄都傻眼了

前言 &#x1f34a;缘由 线上问题把我坑&#xff0c;一查数据让我蒙 &#x1f423;闪亮主角 大家好&#xff0c;我是JavaDog程序狗 今天跟大家分享一个本狗造成的线上事故&#xff0c; 一个简单的SQL查询语句导致的bug &#x1f608;你想听的故事 最近狗哥有点飘&#xf…

MCU1.51单片机介绍

1.单片机&#xff08;MCU 全称 Mirco Controller Unit 意为微小控制器的集合&#xff09; 相当于一台迷你电脑&#xff08;集成了很多硬件&#xff09; 2.作用 传感&#xff08;采集信息&#xff09;&#xff0c;处理&#xff08;CPU Central Processing Unit 中央处理器&am…

智能的瓶颈在于事物表征的弥散与聚合性(弥聚性)

动态“弥散与聚合性”&#xff08;弥聚性&#xff09;是智能系统面临的一个重要挑战。这个概念涉及如何在处理信息时平衡广度和深度&#xff0c;以及如何有效地表征和组织知识。 &#xff08;1&#xff09;弥散性 弥散性指的是信息或知识的分散性和多样性。智能系统需要处理来自…

非对称RAID破解SSD异构存储难题

上一篇文章&#xff08;Kioxia的NVMe RAID卸载有何亮点&#xff1f;&#xff09;介绍了NVMe RAID卸载方案内容。本文我们结合一篇学术论文&#xff0c;学习一下新的非对称RAID架构&#xff5e; 随着大数据时代的到来&#xff0c;全闪存阵列&#xff08;All-Flash Arrays, AFAs&…

校园一卡通|基于SprinBoot+vue的校园一卡通系统(源码+数据库+文档)

校园一卡通系统 基于SprinBootvue的校园一卡通系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员功能实现 学生功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

linux驱动 -- PWM配置和SysFs操作方法

1&#xff1a;PWM介绍 PWM的定义为:可调节脉冲调节器&#xff0c;换句话来说就是一个总周期不变&#xff0c;占空比可调节的方波。 2&#xff1a;PWM的总周期和占空比、有效点平 方波&#xff1a;在信号领域一般分为数字信号和模拟信号&#xff0c;数字信号就两种状态&#…

UML类图中的依赖,继承,和实现关系

依赖关系 依赖关系是一种使用关系&#xff0c;它是对象之间耦合度最弱的一种关系。在代码中&#xff0c;某个类通过局部变量&#xff0c;方法的参数或者对静态方法的调用来访问另外一个类的方法。 依赖关系通过带箭头的虚线表示&#xff0c;箭头从使用类指向被依赖的类 继承关…

中仕公考怎么样?函授大专可以考公吗?

函授大专学历&#xff0c;作为成人高等教育的一种形式&#xff0c;是被认证的&#xff0c;所以在绝大多数情况下&#xff0c;持有函授大专学历的个人符合公务员及事业单位岗位的报考资格。只有招聘公告中明确要求考生必须持有全日制或统招学历时&#xff0c;才不符合条件。 在…

【STM32开发指南】STM32最小系统板详解

【前言】 在单片机项目开发中&#xff0c;STM32系列微控制器因其高性能、低功耗和丰富的外设资源而备受青睐。其中&#xff0c;STM32最小系统板作为STMicroelectronics STM32系列微控制器的基础硬件平台&#xff0c;不仅简化了硬件设计&#xff0c;还极大地促进了软件开发的便…

用ChatGPT提升论文质量:改进语法、用词和行文的有效方法

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术写作中&#xff0c;语法、用词和行文的质量直接影响论文的可读性和学术价值。今天我们将介绍如何利用ChatGPT优化论文的语法结构、改进用词精准度以及提升行文流畅性。帮助写作者…

多线程篇(锁相关类- StampedLock(改进的读写锁)(JDK8新增))(持续更新迭代)

目录 一、前言 二、StampedLock提供的三种读写模式的锁分别如下 写锁writeLock 悲观读锁 readLock 乐观读锁 tryOptimisticRead 三、StampedLock支持这三种锁在一定条件下进行相互转换 四、案例介绍 五、知识小结 一、前言 StampedLock 是并发包里面 JDK8 版本新增的一…

线性代数 第二讲 矩阵_逆矩阵_伴随矩阵_分块矩阵_初等矩阵_矩阵的秩

矩阵 文章目录 矩阵1.矩阵的定义2.矩阵的运算法则3.特殊矩阵3.1 伴随矩阵3.2 可逆矩阵3.2.1 定义3.2.2 可逆矩阵的一些定理3.2.3 可逆矩阵公式与转置矩阵公式3.2.4 求逆矩阵 3.3 分块矩阵3.3.1 分块矩阵的运算3.3.2 分块矩阵的初等行变换&#xff08;超纲内容但要了解&#xff…

YOLOv9输出模型每一层的耗时和GFLOPs

在做一些比较实验中&#xff0c;如何更精确的查看和对比我们的改进模块时候有效&#xff0c;是否有提升&#xff0c;特别是在模型轻量化时&#xff0c;这时候我们就可以打印改进模型每一层的耗时和GFLOPS来比较不同模块的占用量。在YOLOv9中&#xff0c;打印模型每一层的耗时和…

食堂线上预约点餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;菜品分类管理&#xff0c;菜品管理&#xff0c;关于我们管理&#xff0c;意见反馈&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;菜品&#xff0c;购…

TPH-YOLOv5:基于Transformer预测头的改进YOLOv5,用于无人机捕获场景的目标检测

摘要 提出了TPH-YOLOv5。在YOLOv5的基础上&#xff0c;增加了一个预测头来检测不同尺度的目标。然后用Transformer Prediction Heads&#xff08;TPH&#xff09;代替原有的预测头&#xff0c;探索自注意机制的预测潜力。还集成了卷积块注意力模型&#xff08;CBAM&#xff09;…

2D 智慧水务厂:引领水资源数字化管理

图扑 2D 智慧水务厂通过数字监控和数据分析&#xff0c;实现高效水资源管理与优化&#xff0c;显著提升运营效率。