【C++】类与对象基础概念解析

news2024/11/27 12:50:49

恭喜你学习完C语言与数据结构的有关内容,现在让我们开始进行对C++的学习吧~

💝💝💝如果你对C语言或数据结构还存在疑惑,欢迎观看我之前的作品

👉【数据结构】

👉【C语言】


目录

一、引言

二、类的定义

三、对象的创建和使用

四、构造函数和析构函数

五、总结


一、引言

C++ 作为一种强大的面向对象编程语言类与对象是其核心概念之一。理解和掌握类与对象对于编写高效、可维护的 C++ 程序至关重要。本文将深入介绍 C++ 中类与对象的基础概念,帮助初学者建立坚实的基础。

二、类的定义

在 C++ 中,类是一种用户自定义的数据类型,它将数据和对数据进行操作的函数封装在一起。类的定义通常包括以下部分:

class ClassName {
public:
    // 成员函数声明
    void function1();
    int function2(int param);

private:
    // 数据成员声明
    int data1;
    double data2;
};

1.访问限定符

  • public:声明在public部分的成员可以在类的外部被访问。通常,成员函数会被定义为public,以便外部代码能够调用它们来操作类的数据。
  • private:声明在private部分的成员只能在类的内部被访问。数据成员通常被定义为private,以保护数据的完整性和安全性,防止外部代码直接修改数据。
  • 还有protected访问限定符,用于在继承中控制成员的访问权限,本文暂不深入讨论。

2.成员函数

  • 成员函数是类中定义的函数,它们可以访问类的成员数据并对其进行操作。成员函数可以在类内定义,也可以在类外定义。在类外定义成员函数时,需要使用类名和作用域解析运算符::
  • 例如:
void ClassName::function1() {
    // 函数体实现
}

int ClassName::function2(int param) {
    // 函数体实现,可能会使用类的数据成员
    data1 += param;
    return data1;
}

3.数据成员

  • 数据成员是类中用于存储数据的变量。它们可以是各种数据类型,如整数、浮点数、字符等,也可以是其他类的对象。数据成员的初始化可以在类的构造函数中进行,也可以在定义时进行默认初始化。

三、对象的创建和使用

类只是一种定义,要使用类中的数据和函数,需要创建类的对象。对象是类的实例,它具有类所定义的属性和行为。

1.对象的创建

  • 可以通过以下方式创建类的对象:
ClassName obj; // 创建一个名为obj的ClassName类的对象
  • 也可以使用动态内存分配来创建对象:
ClassName* ptr = new ClassName; // 创建一个指向ClassName类对象的指针
  • 在使用动态分配的对象时,需要注意在不需要该对象时使用delete运算符释放内存,以避免内存泄漏。

2.访问对象的成员

  • 通过对象可以访问类的公共成员函数和数据成员。使用点运算符.来访问对象的成员
obj.function1(); // 调用对象obj的function1成员函数
int result = obj.function2(5); // 调用function2并传入参数5,获取返回值
cout << obj.data1; // 访问对象obj的数据成员data1(假设data1是public的,否则会编译错误)
  • 如果是通过指针访问对象的成员,则使用箭头运算符->
ptr->function1();
result = ptr->function2(3);
cout << ptr->data1;

四、构造函数和析构函数

1.构造函数

  • 构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。构造函数的名称与类名相同,没有返回值类型。
  • 可以定义多个构造函数,以实现不同方式的初始化。例如:
class ClassName {
public:
    ClassName() {
        // 默认构造函数,用于初始化数据成员为默认值
        data1 = 0;
        data2 = 0.0;
    }

    ClassName(int val1, double val2) {
        // 带参数的构造函数,用于根据传入的参数初始化数据成员
        data1 = val1;
        data2 = val2;
    }
private:
    int data1;
    double data2;
};
  • 创建对象时,会自动调用相应的构造函数。例如:
ClassName obj1; // 调用默认构造函数
ClassName obj2(10, 3.14); // 调用带参数的构造函数

2.析构函数

  • 析构函数是在对象被销毁时自动调用的特殊成员函数,用于释放对象所占用的资源。析构函数的名称是在类名前加上波浪线~,没有参数和返回值类型。
  • 例如:
class ClassName {
public:
    ~ClassName() {
        // 析构函数的实现,可能用于释放动态分配的内存等资源
        // 这里假设没有动态分配的内存,只是简单的示例
    }
private:
    int* ptr; // 假设类中有一个指向整数的指针成员
};
  • 当对象超出其作用域或使用delete运算符释放动态分配的对象时,析构函数会被自动调用。例如:
{
    ClassName obj; // 在这个块内创建对象obj,当块结束时,obj会被销毁,析构函数会被调用
}

ClassName* ptr = new ClassName; // 创建动态分配的对象
//... 使用ptr指向的对象
delete ptr; // 释放对象,析构函数会被调用

五、this 指针

在类的成员函数中,经常会用到this指针。this指针是一个指向当前对象的指针,它可以用于区分成员函数中的局部变量和类的成员变量

例如,在构造函数中: 

Car::Car(std::string brand, std::string model, std::string color) {
    this->brand = brand;
    this->model = model;
    this->color = color;
    speed = 0;
}

这里的this->brandthis->modelthis->color分别表示当前对象的brandmodelcolor成员变量。如果没有this指针,编译器将无法确定这些变量是类的成员变量还是局部变量

this指针还可以用于在成员函数中返回当前对象的引用,这在一些需要连续调用成员函数的场景中很有用。例如:

class Car {
public:
    // 其他成员函数和属性

    Car& setBrand(std::string brand) {
        this->brand = brand;
        return *this;
    }

    Car& setModel(std::string model) {
        this->model = model;
        return *this;
    }

    Car& setColor(std::string color) {
        this->color = color;
        return *this;
    }
};

现在,我们可以这样使用: 

Car myCar;
myCar.setBrand("Toyota").setModel("Corolla").setColor("Blue");

通过这种方式,我们可以更加方便地对对象进行初始化和设置属性。 

 

六、总结

本文介绍了 C++ 中类与对象的基础概念,包括类的定义、对象的创建和使用、构造函数和析构函数。类是一种自定义的数据类型,它将数据和操作封装在一起,通过创建对象来使用类的功能。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理。理解这些基础概念是进一步学习 C++ 面向对象编程的关键,为编写复杂、高效的程序奠定基础。

在后续的文章中,我们将深入探讨类的更多特性和高级用法!


💝💝💝感谢你看到最后,点个赞再走吧!💝💝💝 

以下是一个投票,欢迎你参与,让我们一起了解大家对C++类与对象的认知和兴趣程度:

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

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

相关文章

【2024年最新】基于springboot+mysql就业信息管理系统

技术摘要 技术框架&#xff1a;以springboot作为框架&#xff0c;业务模式&#xff1a;B/S模式数据库&#xff1a;MySql作为后台运行的数据库服务器&#xff1a;使用Tomcat用为系统的服务器 系统展示 系统实现功能 本次实现一个就业信息管理系统&#xff0c;通过这个系统能够…

vscode安装及c++配置编译

1、VScode下载 VS Code官网下载地址&#xff1a;Visual Studio Code - Code Editing. Redefined。 2、安装中文插件 搜索chinese&#xff0c;点击install下载安装中文插件。 3、VS Code配置C/C开发环境 3.1、MinGW-w64下载 VS Code是一个高级的编辑器&#xff0c;只能用来写代…

嵌入式系统中qt开发 Qdebug输出中文的时候变成了问号 ??? bulideroot制作的根文件系统

嵌入式系统中qt开发 Qdebug输出&#xff1f;&#xff1f;&#xff1f; bulideroot制作的根文件系统 这个问题我找了三四天了&#xff0c;因为的字符也配置了 /etc/profile中qt的环境变量我也配置了 我的/usr/share/fonts也是有字库的&#xff0c;但是qt输出的中文全是&#…

windows 11 LTSC 26100.1742 官方简体中文版

系统简介 Windows 11 LTSC&#xff08;长期服务通道&#xff09;是一个专为长期稳定性和可靠性设计的Windows 11变体&#xff0c;适合于需要最小更新和更改的关键任务系统和设备。与常规版本相比&#xff0c;LTSC版本的特点是更新频率较低&#xff0c;目的是为了保持系统的稳定…

从零开始掌握YOLOv11:揭秘三大损失函数的理想值(源码+实战)

相关文章&#xff1a; YOLOv1–v11: 版本演进及其关键技术解析-CSDN博客 YOLOv11&#xff1a;重新定义实时目标检测的未来-CSDN博客 Yolo v11目标检测实战1&#xff1a;对象分割和人流跟踪&#xff08;附源码&#xff09;-CSDN博客 YOLOv11目标检测实战2&#xff1a;人流统计…

win10下cuda12.1 +troch2.4.1+vs2022环境下编译安装flash-attn

步骤一 下载项目 先下载 https://github.com/Dao-AILab/flash-attention&#xff0c;然后在conda环境中进入项目目录 步骤二 安装依赖项 执行以下命令&#xff0c;安装cutlass库&#xff0c;该库为编译flash-attn的必须依赖 conda update --force conda conda install conda…

Linux文件重定向文件缓冲区

目录 一、C文件接口 二、系统文件I/O 2.1认识系统文件I/O 2.2系统文件I/O 2.3系统调用和库函数 2.4open( )的返回值--文件描述符 2.5访问文件的本质 三、文件重定向 3.1认识文件重定向 3.2文件重定向的本质 3.3在shell中添加重定向功能 3.4stdout和stderr 3.5如何理…

Java | Leetcode Java题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; class Solution {public int numberOfArithmeticSlices(int[] nums) {int ans 0;int n nums.length;Map<Long, Integer>[] f new Map[n];for (int i 0; i < n; i) {f[i] new HashMap<Long, Integer>();}for (int i 0;…

深度学习中的优化方法(Momentum,AdaGrad,RMSProp,Adam)详解及调用

深度学习中常用的优化方法包括啦momentum(动量法),Adagrad(adaptive gradient自适应梯度法),RMSProp(root mean square propagation均方根传播算法),Adam(adaptive moment estimation自适应矩估计法) 指数加权平均算法 所谓指数加权平均算法是上述优化算法的基础,其作用是对历…

定制化CRM如何重塑科技服务领域的生态链?

企业不仅面临着技术创新与知识产权保护的双重挑战&#xff0c;还需在激烈的市场竞争中构建稳固的客户关系与广泛的合作网络。传统的CRM&#xff08;客户关系管理&#xff09;系统&#xff0c;往往局限于企业内部的数据管理与流程优化&#xff0c;难以满足当前复杂多变的业务需求…

初识Linux · 进程替换

目录 前言&#xff1a; 1 直接看代码和现象 2 解释原理 3 将代码改成多进程版本 4 认识所有函数并使用 前言&#xff1a; 由前面的章节学习&#xff0c;我们已经了解了进程状态&#xff0c;进程终止以及进程等待&#xff0c;今天&#xff0c;我们学习进程替换。进程替换我…

【2023工业3D异常检测文献】Shape-Guided: 基于形状引导和双记忆库的异常检测方法

Shape-Guided Dual-Memory Learning for 3D Anomaly Detection 1、Background 提出了一个以形状为指导的专家学习框架&#xff0c;用于解决无监督3D异常检测的问题。 该方法建立在两个专门的专家模型及其协同作用的基础上&#xff0c;以从颜色和形状模态中定位异常区域。 第…

vue项目-仿知乎页面的路由跳转

这篇文章记录一下该项目的路由跳转&#xff0c;首先是登录页 登录页路由跳转到首页也就是index文件夹中 然后展示contentleft组件和contentright组件&#xff0c;他们在页面上的显示是这样的 然后每一个功能部分也会有另一个url&#xff0c;去跳转更详细的界面 有时间继续…

python-斐波那契词序列/最大回文乘积/求最大最小k个元素

一:斐波那契词序列题目描述 编写一个程序&#xff0c;生成斐波那契词序列的前n个元素。 斐波那契词序列是一个词序列&#xff0c;其中每个词是通过连接前两个词形成的。 它以斐波那契序列命名&#xff0c;因为它是以类似的方式创建的&#xff0c;但是我们不是加数字&#xff0c…

美国游戏玩家的文化偏好

美国游戏市场是世界上最大、最多样化的市场之一&#xff0c;受到一系列文化、社会和经济因素的影响。美国游戏玩家通常以参与技术和娱乐为特征&#xff0c;表现出由个人主义、竞争和社交互动驱动的偏好。主要趋势和偏好在这个市场中脱颖而出&#xff1a; 游戏类型多样 美国玩…

毕业设计选题:基于ssm+vue+uniapp的教学辅助小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

Resdis中关于字符串类型的基础命令

本文主要详解key-value中vaule为字符串类型的情况&#xff0c;value属于其他的数据类型不适应&#xff1b;有几个命令是通用命令 目录 1.set和get 2.keys 3.exists 4.del 5.expire 6.ttl 7.type 8.object encoding key 9.加减操作 10.字符串操作 11.命令小结 1.se…

拿下奇怪的前端报错:SyntaxError: Unexpected token ‘??=‘或‘xxx‘ - 浅谈Nodejs版本过高过低的部分问题

在前端开发时&#xff0c;如果同时维护多个项目&#xff0c;跨越的年度又比较大&#xff0c;难免会使用多个Nodejs版本。有时候版本不对&#xff0c;不仅仅是安装会报错 1 依赖无法安装 一般情况下nodejs又向后兼容较好&#xff08;除了部分三方包&#xff09;&#xff0c;所…

day03-js 作业

js基础 一.选择 1C 2C 3D 4C 5B 6B 7C 8A 二.编程 2 函数 数组与对象 一.选择 1D 2C 3D 4A 5D 6B 7B 8A 二.编程 1 2 4

Linux驱动开发(速记版)--设备树插件

第六十八章 设备树插件介绍 Linux 4.4之后引入了动态设备树&#xff0c;其中的设备树插件&#xff08;Device Tree Overlay&#xff09;是一种扩展机制&#xff0c;允许在运行时动态添加、修改或删除设备节点和属性。 设备树插件机制通过DTS&#xff08;设备树源文件&#xff0…