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

恭喜你学习完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.mfbz.cn/a/886550.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MapBox Android版开发 6 关于Logo

MapBox Android版开发 6 关于Logo Logo的显示查看源码及思路&#xff08;Logo&#xff09;第一步第二步 隐藏Logo示例查看源码及思路&#xff08;Info&#xff09;第一步第二步 隐藏Logo和Info示例 看到有网友留言问如何移除Logo&#xff0c;今天看了下V9源码&#xff0c;发现M…

CORE MVC 过滤器 (筛选器)《2》 TypeFilter、ServiceFilter

TypeFilter、ServiceFilter ServiceFilter vs TypeFilter ServiceFilter和TypeFilter都实现了IFilterFactory ServiceFilter需要对自定义的Filter进行注册&#xff0c;TypeFilter不需要 ServiceFilter的Filter生命周期源自于您如何注册&#xff08;全局、区域&#xff09;&…

Ps:打开与置入

在 Adobe Photoshop 中&#xff0c;理解不同的“打开”和“置入”命令及其用途&#xff0c;可以根据不同的需求选择最佳方式来管理和编辑图像文件。 ◆ ◆ ◆ 打开 1、Ps菜单&#xff1a;文件/打开 File/Open 快捷键&#xff1a;Ctrl O 用于直接打开现有的图像文件。 打开的…

【HDP】zookeeper未授权漏洞修复

目录 一、禁用四字命令 二、ZK-Client增加kerberos 一、禁用四字命令 Zookeeper四字命令的使用方式非常简单&#xff0c;通常有两种方式。第一种是通过Telnet方式&#xff0c;使用Telnet客户端登录ZooKeeper的对外服务端口&#xff0c;然后直接使用四字命令即可&#xff1b;第…

计算机网络-系分(5)

目录 计算机网络 DNS解析 DHCP动态主机配置协议 网络规划与设计 层次化网络设计 网络冗余设计 综合布线系统 1. 双栈技术 2. 隧道技术 3. 协议转换技术 其他网络技术 DAS&#xff08;Direct Attached Storage&#xff0c;直连存储&#xff09; NAS&#xff08;Net…

centos环境安装JDK详细教程

centos环境安装JDK详细教程 一、前期准备二、JDK安装2.1 rpm方式安装JDK2.2 zip方式安装JDK2.3 yum方式安装JDK 本文主要说明CentOS下JDK的安装过程。JDK的安装有三种方式&#xff0c;用户可根据实际情况选择&#xff1a; 一、前期准备 查看服务器操作系统型号&#xff0c;执…

【Android 14源码分析】Activity启动流程-3

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

鸿蒙harmonyos next纯flutter开发环境搭建

公司app是用纯flutter开发的&#xff0c;目前支持android和iOS&#xff0c;后续估计也会支持鸿蒙harmonyos。目前谷歌flutter并没有支持咱们国产手机操作系统鸿蒙harmonyos&#xff0c;于是乎国内有个叫OpenHarmony-SIG的组织&#xff0c;去做了鸿蒙harmonyos适配flutter开发的…

安卓主板_MTK4G/5G音视频记录仪整机及方案定制

音视频记录仪方案&#xff0c;采用联发科MT6877平台八核2* A78 6* A55主频高达2.4GHz, 具有高能低耗特性&#xff0c;搭载Android 12.0智能操作系统&#xff0c;可选4GB32GB/6GB128GB内存&#xff0c;运行流畅。主板集成NFC、双摄像头、防抖以及多种无线数据连接&#xff0c;支…

【web安全】——sql注入

1.MySQL基础 1.1information_schema数据库详解 简介&#xff1a; 在mysql5版本以后&#xff0c;为了方便管理&#xff0c;默认定义了information_schema数据库&#xff0c;用来存储数据库元数据信息。schemata(数据库名)、tables(表名tableschema)、columns(列名或字段名)。…

java设计模式介绍

常见的设计模式有哪些呢&#xff1f; 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 就像是武林中的“独孤求败”&#xff0c;一个类只有一个实例&#xff0c;并提供一个全局访问点。 常用于需要控制资源访问的场景&#xff0c;比如数据库连接池。 工厂模式…

828华为云征文|部署音乐流媒体服务器 mStream

828华为云征文&#xff5c;部署音乐流媒体服务器 mStream 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 mStream3.1 mStream 介绍3.2 mStream 部署3.3 mStream 使用 四、…

51c自动驾驶~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11466109 #HTCL 超过所有视觉方案&#xff01;HTCL&#xff1a;分层时间上下文问鼎OCC 本文是对ECCV2024接受的文章 HTCL: 的介绍&#xff0c;HTCL在SemanticKITTI基准测试中超过了所有基于相机的方法&#xff0c;甚至在和…

java中创建不可变集合

一.应用场景 二.创建不可变集合的书写格式&#xff08;List&#xff0c;Set&#xff0c;Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…

每日OJ题_牛客_游游的水果大礼包_枚举_C++_Java

目录 牛客_游游的水果大礼包 题目解析 C代码 Java代码 牛客_游游的水果大礼包 游游的水果大礼包 (nowcoder.com) 描述&#xff1a; 游游有n个苹果&#xff0c;m个桃子。她可以把2个苹果和1个桃子组成价值a元的一号水果大礼包&#xff0c;也可以把1个苹果和2个桃子…

拆解维修飞科剃须刀

原因 用了好几年的剃须刀&#xff0c;经过一次更换电池。后来上面的盖帽松动&#xff0c;无法合盖&#xff0c;经过把弹片矫正后修复。最近一次”大力出奇迹“的操作直接断送了这个老伤员最后的可能性。最终只能花了将近十块大洋买了一套盖着和中间座。简单更换了一下。 记录…

Unity NetCode 客户端连接不上服务器,局域网模式 Failed to connect to server.

报错代码: Failed to connect to server. 报错截图&#xff1a; 解决办法: 服务端:绑定127.0.0.1和端口 客户端:写好对应服务端ip和端口 如何查看服务端所在局域网IP&#xff0c;192.xxx.xxx.xx,就不用教了吧。 注意这个钩&#xff0c;得点下&#xff0c;默认不勾选。 意…

【注册/登录安全分析报告:孔夫子旧书网】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

docker运行arm64架构的镜像、不同平台镜像构建

背景 Docker 允许开发者将应用及其依赖打包成一个轻量级、可移植的容器&#xff0c;实现“一次构建&#xff0c;到处运行”的目标。然而&#xff0c;不同的操作系统和硬件架构对容器镜像有不同的要求。例如&#xff0c;Linux 和 Windows 系统有不同的文件系统和系统调用&#…

【Xcode Command Line Tools】安装指南

安装指令 xcode-select --install安装 完成安装 验证 $ xcode-select -p /Library/Developer/CommandLineTools