C++语言之类与对象1

什么是类

类是一种抽象的数据类型,作为对象的蓝图或模板,它将具有相同属性和行为的对象进行统一抽象封装。其中属性描述对象的特征,如 “汽车” 类中的颜色、品牌等;方法则定义对象可执行的操作,像 “汽车” 类的启动、加速等方法。

什么是对象

对象是类的实例化,是依据类所定义的模板创建出的具体实体。其状态由属性值决定,如某辆具体汽车的红色、宝马等属性值构成其状态;行为通过调用所属类的方法实现,如调用汽车的启动、加速方法展现其行为。

类与对象的关系

类是对象的抽象概括,提取了相似对象的共性形成通用模板,不指向具体实体。而对象是类的具体体现,虽都具有类定义的属性和方法,但属性值不同,状态和行为也各异,如不同汽车对象的属性值及行为表现均有差别。

如何定义一个类

语法:

        class 类名

        {

                成员变量:描述事物的静态特征,一个类中可以有多个成员变量,也可以一个都没有

                构造函数:创建对象

                析构函数:回收对象

                拷贝构造:对象赋值给对象

                成员函数:描述事物的动态特征

        }

如:

        

#include <iostream>
#include <string>

// 定义Person类
class Person {
public:
    std::string name;  // 成员变量,用于存储人的姓名
    int age;           // 成员变量,用于存储人的年龄

    // 成员函数,用于设置人的姓名和年龄
    void setInfo(const std::string& n, int a) {
        name = n;
        age = a;
    }

    // 成员函数,用于输出人的信息
    void showInfo() {
        std::cout << "姓名:" << name << ",年龄:" << age << std::endl;
    }
};

int main() {
    // 创建一个Person类的对象p1
    Person p1;
    // 使用对象p1调用成员函数setInfo来设置信息
    p1.setInfo("小明", 20);
    // 使用对象p1调用成员函数showInfo来展示信息
    p1.showInfo();

    return 0;
}

注意:

        因为类的定义只需定义一次,所以我们一般将其写在头文件中

        但是类中有成员函数,头文件中对函数只声明不实现

        所以在头文件中定义类,在其对应的源文件中实现其类的成员函数

如何创建一个对象

语法:

        类名 对象名;

对象的使用:

        获取成员变量的值

                对象名.成员变量名

        修改成员变量的值

                对象名.成员变量名 = 值;

        调用成员函数

                对象名.成员函数名(实参列表)

注意:

        一个类可以创建多个对象

        多个对象之间互不打扰

访问权限修饰符

作用:

        限定类中的成员使用范围

访问权限修饰符:

        

public:程序任何一处可直接使用

protected:当前类中或子类中使用

private:当前类中使用


使用:

        class 类名

        {

        private:

                成员

        public:

                成员

        protected:

                成员

        }

类的设计

私有化成员变量

通过将成员变量设为私有,限制外部直接访问,就像给数据加锁,仅类内可操作,避免外部随意更改致数据混乱,增强类及程序的稳定性与可维护性,比如 “员工” 类里工资变量私有化的情况。

公共成员函数

把成员函数设为公共来构建类与外部交互的接口,外部按规定调用函数让类执行任务,无需知晓内部实现细节,能降低类间耦合、提高代码模块化程度,像 “图形” 类中绘制、算面积等公有函数便于协同工作。

提供 get 与 set 函数

因成员变量私有化,外部需获取和修改值时,get 函数用于返回私有变量值,告知外部其状态;set 函数接收外部值,经合法性检查后赋给私有变量,间接实现修改,如 “学生” 类里成绩、年龄变量对应的操作。

this关键字

概念:

        this 是一个指针,它所指向的对象取决于调用 this 所在函数的对象,也就是说,谁调用了这个函数,this 就代表谁。

作用:

        1,在当前类中调用当前类的成员,此时this可以忽略不写

        2,当局部变量与成员变量重名时

                变量名        局部变量

                this->变量名        成员变量

如:   

#include <iostream>

class Person {
public:
    std::string name;
    int age;

    void setName(const std::string& newName) {
        this->name = newName;
    }

    void setAge(int newAge) {
        this->age = newAge;
    }

    void showInfo() {
        std::cout << "姓名: " << this->name << ", 年龄: " << this->age << std::endl;
    }
};

int main() {
    Person p;
    p.setName("小明");
    p.setAge(20);
    p.showInfo();

    return 0;
}

构造函数

作用:创建本类对象时调用

语法:

        类名(形参列表)

        {

                函数体

        }

调用:

        调用无参构造:

                类名  对象名;

        调用有参构造:

                类名  对象名(实参列表);

注意:

        1,如果一个类中没有自定义构造函数,系统将为其提供一个无参构造

        2,如果一个类中有自定义构造函数,系统将不会为其提供无参构造函数

        3,一个类中可以有多个构造函数,这多个构造函数的关系是重载

析构函数

作用:当对象被销毁时调用

语法:

        ~类名()

        {

                函数体

        }

注意:

        一个类中只能写一个析构函数

        如果不写,系统为其提供一个默认的析构函数

拷贝构造

作用:此类对象A赋值给此类对象B 会触发拷贝构造

        类名 对象名A;

        类名 对象名B = 对象名A;

语法:

        类名(const 类名& 别名)

        {

                函数体

        }

注意:

        此时不会触发构造函数

        注意浅拷贝,此时一定要进行深拷贝,避免重复释放导致的崩溃

初始化列表

语法:

        类名(形参列表):成员变量名(形参中的变量名),成员变量名(形参中的变量名),...

        {

                函数体

        }

注意:

        基本类型除外实现的是浅拷贝

如:

#include <iostream>
#include <string>

class Person {
public:
    std::string name;
    int age;

    // 普通构造函数,用于初始化对象的成员变量
    Person(const std::string& n, int a) : name(n), age(a) {}

    // 拷贝构造函数
    Person(const Person& other) {
        this->name = other.name;
        this->age = other.age;
        std::cout << "拷贝构造函数被调用" << std::endl;
    }

    void showInfo() {
        std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
    }
};

int main() {
    Person person1("小明", 20);

    // 这里会触发拷贝构造函数,用person1初始化person2
    Person person2 = person1;

    person1.showInfo();
    person2.showInfo();

    return 0;
}

隐式转换

当调用的构造函数只有一个参数时,可以进行隐式转换。

语法:

        类名 对象名 = 实参;

explicit关键字:

        作用:进制隐式转换 

        语法:

                explicit 类名(形参)

                {         }      

new

作用:在堆内存创建对象

语法:

        类名 *对象指针 = new 类名;

        类名 *对象指针 = new 类名(实参列表);

步骤:

        先在堆中开辟内存

        再调用构造函数

delete

作用:

        释放对象在堆内存占用的空间

语法:

        delete 对象指针;

步骤:

        先执行析构函数

        再释放对象指针指向的内存

类B的对象作为类A的成员变量

创建时构造函数的调用顺序

先成员构造

再自己构造

销毁时析构函数的调用顺序

先自己析构

再成员析构

注意

使用new创建A类对象时,依旧会先创建其成员类B的对象

        先成员构造

        再自己构造

使用new是在堆中开辟的,无法自动释放,需要使用delete

        先自己析构

        再成员析构

class B{

public:

        char *name = (char *)calloc(50,1);

        ~B()

        {    free(name);    }

}

class A{

        B b;

}

int mian()

{

        A *a = new A;

        delete a;

}

对象数组

作用:

        存储对象的数组

静态创建:

        类名 数组名[长度] = {对象1,对象2,对象.....};

动态创建:

        类名 *数组名 = new 类名[]{对象1,对象2,对象...};

        注意:

                释放语法:

                        delete [] 数据名;

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

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

相关文章

Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!

作者&#xff1a;来自 Elastic Platform Product Team Elastic Search AI 平台&#xff08;Elasticsearch、Kibana 和机器学习&#xff09;的 8.16 版本包含大量新功能&#xff0c;可提高性能、优化工作流程和简化数据管理。 使用更好的二进制量化 (Better Binary Quantizatio…

【Golang】——Gin 框架简介与安装

文章目录 1. Gin 框架概述1.1 什么是 Gin 框架&#xff1f;1.2 为什么选择 Gin&#xff1f;1.3 使用场景 2. 安装 Go 与 Gin 框架2.1 安装 Go 语言环境2.2 初始化 Go 项目2.3 安装 Gin 框架 3. 编写第一个 Gin 应用3.1 Gin 最小化示例代码代码解读3.2 运行程序3.3 测试服务 4. …

RGB与YCbCr转换算法

目录 RGB与YCbCr转换算法RGB与YCbCr色域介绍RGB模型YCbCr色域简介YCbCr的应用YUV 和 YCbCr 的区别 色彩转换公式 RGB 转 YCbCr 实现RGB 转 YCbCr 的 Matlab 实现RGB 转 YCbCr 的 FPGA 实现 YCbCr 转 RGB 实现YCbCr 转 RGB 的 Matlab 实现YCbCr 转 RGB 的 FPGA 实现 RGB与YCbCr转…

WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇&#xff08;本文&#xff09; WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前言…

MAC上的Office三件套报53错误解决方案(随笔记)

目录 现象原因解决方式1. 可视化2. 命令行 参考链接 现象 最近Mac Mini M4非常热门&#xff0c;我也种草买了一台丐中丐版本来体验一下。 在安装Office三件套后&#xff0c;遇到了一个53的错误&#xff1a; Run-time error 53:File not found: Library/Application Support/A…

人工智能与SEO优化中的关键词策略解析

内容概要 在当今数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;与搜索引擎优化&#xff08;SEO&#xff09;的结合正变得愈发重要。关键词策略是SEO优化的一项基础工作&#xff0c;它直接影响到网站的可见性和流量。通过运用智能算法&#xff0c;企业能…

【数据库】如何保证数据库迁移过程中数据的一致性?

在数据库迁移过程中&#xff0c;保证数据的一致性是非常重要的&#xff0c;尤其是在涉及到多个表、多个数据库或分布式系统的情况下。以下是一些确保数据一致性的最佳实践和方法&#xff1a; 1. 备份数据 在开始迁移之前&#xff0c;进行全面的数据备份是确保数据一致性的第…

Kubernetes 10 问,测测你对 k8s 的理解程度

Kubernetes 10 问 假设集群有 2 个 node 节点&#xff0c;其中一个有 pod&#xff0c;另一个则没有&#xff0c;那么新的 pod 会被调度到哪个节点上&#xff1f; 应用程序通过容器的形式运行&#xff0c;如果 OOM&#xff08;Out-of-Memory&#xff09;了&#xff0c;是容器重…

Spring:IoC/DI加载properties文件

Spring框架可以通过Spring的配置文件完成两个数据源druid和C3P0的配置&#xff08;Spring&#xff1a;IOC/DI配置管理第三方bean&#xff09;&#xff0c;但是其中包含了一些问题&#xff0c;我们来分析下: 这两个数据源中都使用到了一些固定的常量如数据库连接四要素&#xf…

时钟之CSS+JS版

写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单&#xff0c;缺点当然是不够灵活。下一篇会基于HTML5的canvas标签&#xff0c;使用JS绘制。会更灵活&#xff0c;元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…

云计算虚拟化-kvm创建虚拟机

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 虚拟化&#xff0c;简单来说就是把一台服务器/PC电脑&#xff0c;虚拟成多台独立的虚拟机&#xff0c;每台虚拟机之间相互隔…

<QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全

原因&#xff1a;Chrome 不信任 ssc 证书 使启用了 HTTPS&#xff0c;即使有使用 自签名证书 (self-signed certificate 非由可信的证书颁发机构 【CA&#xff0c;Certificate Authority】签发的&#xff09;。浏览器 Chrome 默认不信任自签名证书&#xff0c;也会报 NET::ERR_…

模板——实现泛型编程的有力武器

模板——实现泛型编程的有力武器 我们为什么需要模板&#xff1f;模板 前言&#xff1a;关于模板&#xff0c;相信大家都有所而闻&#xff0c;以下是我对C模板的个人看法&#xff0c;希望能够帮助到你们呀&#xff01; 我们为什么需要模板&#xff1f; 请到大家看这一段代码&a…

针对git、giteeVSCode连接的使用 || Live Share插件使用

1.下载git 链接 打开终端&#xff0c;桌面鼠标右键 2.配置密钥 登录gitee。 设置密钥 查看官方文档 跟着教程 复制最后的输出进行密钥添加 验证是否添加成功 3.创建&连接远程仓库 创建仓库 git终端进行配置 远程仓库克隆到本地 桌面终端clone,克隆他人|自己的仓库到本地…

OpenGL ES 文字渲染进阶--渲染中文字体

旧文 OpenGL ES 文字渲染方式有几种? 一文中分别介绍了 OpenGL 利用 Canvas 和 FreeType 绘制文字的方法。 无论采用哪种方式进行渲染,本质上原理都是纹理贴图:将带有文字的图像上传到纹理,然后进行贴图。 渲染中文字体 利用 Canvas 绘制中文字体和绘制其他字体在操作方式上…

c# 调用c++ 的dll 出现找不到函数入口点

今天在调用一个设备的dll文件时遇到了一点波折&#xff0c;因为多c 不熟悉&#xff0c;调用过程张出现了找不到函数入口点&#xff0c;一般我们使用c# 调用c 文件&#xff0c;还是比较简单。 [DllImport("AtnDll2.dll",CharSet CharSet.Ansi)]public static extern …

贴代码框架PasteForm特性介绍之markdown和richtext

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

【H3C华三 】VRRP与BFD、Track联动配置案例

原创 厦门微思网络 组网需求 如图1所示&#xff0c;区域A和区域B用户所在网络的出口处部署了两台汇聚层设备&#xff08;Device A和Device B&#xff09;。 现要求使用VRRP与BFD、Track联动功能&#xff0c;实现以下需求&#xff1a; • 在Device A和Device B上分别配置两个…

【ubuntu18.04】vm虚拟机复制粘贴键不能用-最后无奈换版本

我是ubuntu16版本的 之前费老大劲安装的vmware tools结果不能用 我又卸载掉&#xff0c;安装了open-vm-tools 首先删除VMware tools sudo vmware-uninstall-tools.pl sudo rm -rf /usr/lib/vmware-tools sudo apt-get autoremove open-vm-tools --purge再下载open-vm-tools s…

机器学习-37-对ML的思考之机器学习发展的三个阶段和驱动AI发展三驾马车的由来

文章目录 1 引言2 机器学习发展的三个阶段2.1 萌芽期(20世纪50年代)2.1.1 达特茅斯会议(人工智能诞生)2.1.2 机器学习名称的由来2.2 知识期(20世纪80年代)2.2.1 知识瓶颈问题2.2.2 机器学习顶级会议ICML2.2.3 Machine Learning创刊2.2.4 神经网络规则抽取2.3 算法期(20世纪90年…