c++类和对象---上

文章目录

  • 类的介绍
  • 类的声明 1.1 类名 1.2 成员变量 1.3 成员函数 1.4 访问权限

  • 类的定义 2.1 成员变量的初始化 2.2 成员函数的实现

  • 对象的创建和销毁 3.1 默认构造函数 3.2 析构函数 3.3 拷贝构造函数 3.4 对象的实例化 3.5 对象的销毁

  • 成员访问控制 4.1 公有成员 4.2 私有成员 4.3 保护成员

  • 类的封装性 5.1 封装的概念 5.2 封装的好处


前言

        这篇文章主要主要介绍了c++类和对象的前半部分内容,包含类的声明,定义,对象的创建和销毁,成员的访问和控制,类的封装性。


 类的介绍

     c++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。

         类用于指定对象的形式,是一种用户自定义的数据类型,它是一种封装了数据和函数的组合。类中的数据称为成员变量,函数称为成员函数。类可以被看作是一种模板,可以用来创建具有相同属性和行为的多个对象。

一、类的声明

1、类名

        类的声明通常包括类名和它的成员列表,但不包括成员函数的实际代码。类声明的基本语法如下:

          class 类名;

       这种声明被称为前向声明,它是必须的,尤其是当类A中用到了类B,而类B的声明出现在类A的后面时。前向声明只能作为指针或引用,不能定义类的对象,也就不能调用对象中的方法。

2、成员变量

        成员变量(也称为属性或字段)是类中用于存储数据的变量。成员变量可以是任何数据类型,例如整数、浮点数、字符、字符串、甚至是其他对象。

class Person {
    int age;      // 整数类型的成员变量
    std::string name; // 字符串类型的成员变量
};

3、成员函数

       成员函数(也称为方法)是类中用于定义对象行为的函数。成员函数可以访问类的成员变量,并且可以对它们进行操作。

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

public:
    void setName(const std::string& newName) {
        name = newName;
    }

    std::string getName() const {
        return name;
    }
};

4、访问权限

      访问权限定义了类成员(包括成员变量和成员函数)的可见性。常见的访问权限有三种:`public`、`protected` 和 `private`。

public:成员在任何地方都可以访问。
protected:成员只能在类内部和派生类中访问。
private:成员只能在类内部访问。

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

public:
    void setName(const std::string& newName) {
        name = newName;
    }

    std::string getName() const {
        return name;
    }

protected:
    // 保护成员
    // ...

private:
    // 私有成员
    // ...
};

二、类的定义

     定义一个类需要使用关键字 class,然后指定类的名称,并类的主体是包含在一对花括号中,主体包含类的成员变量和成员函数。

定义一个类,本质上是定义一个数据类型的蓝图,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。

      以下实例我们使用关键字 class 定义 Box 数据类型,包含了三个成员变量 length、breadth 和 height:

class Box
{
   public:
      double length;   // 盒子的长度
      double breadth;  // 盒子的宽度
      double height;   // 盒子的高度
};

       关键字 public 确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。也可以指定类的成员为 private 或 protected,这个我们稍后会进行讲解。

2.1 成员变量的初始化

在C++中,成员变量可以在构造函数中初始化,或者使用初始化列表来初始化。

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

public:
    // 构造函数
    Person(int initialAge, const std::string& initialName)
        : age(initialAge), name(initialName) {}

    // 其他成员函数
    // ...
};


 

 2.2 成员函数的实现


       成员函数通常声明在类的声明中,但可以在类的外部实现。如果在类声明中直接实现了成员函数(称为内联函数),则该函数的定义也会出现在类声明中。

#include <iostream>
#include <string>

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

public:
    Person(int initialAge, const std::string& initialName)
        : age(initialAge), name(initialName) {}

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

    std::string getName() const {
        return name;
    }

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

int main() {
    Person person(25, "John Doe");
    person.display();
    return 0;
}

         在这个例子中,`Person` 类有一个构造函数,用于初始化 `age` 和 `name` 成员变量。成员函数 `setName` 和 `getName` 用于设置和获取 `name` 成员变量的值。成员函数 `display` 用于打印 `Person` 对象的信息。

三、对象的创建和销毁

3.1 默认构造函数

       默认构造函数是一个类的特殊成员函数,当对象被创建时自动调用的函数。它没有任何参数,用于初始化对象的成员变量。如果一个类没有显式定义默认构造函数,编译器会自动生成一个默认构造函数。

下面是一个默认构造函数的代码示例:

#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "Default constructor called" << std::endl;
    }
};

int main() {
    MyClass obj;
    return 0;
}

       在这个示例中,MyClass类有一个默认构造函数。默认构造函数没有任何参数,并在创建对象时被调用。在main函数中,我们创建了一个MyClass对象obj,并输出了一条消息来验证默认构造函数被调用。

#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "Default constructor called" << std::endl;
    }
};

int main() {
    MyClass obj;
    return 0;
}

      在这个示例中,MyClass类有一个默认构造函数。默认构造函数没有任何参数,并在创建对象时被调用。在main函数中,我们创建了一个MyClass对象obj,并输出了一条消息来验证默认构造函数被调用。

3.2 析构函数:

      析构函数是一个类的特殊成员函数,用于在对象销毁时自动调用。它的名称与类名相同,但前面加上一个波浪号(~)。析构函数主要用来清理对象所占用的资源,如释放内存、关闭文件等。

       析构函数没有参数,也没有返回值。当对象的作用域结束、程序执行完毕、delete运算符用于释放动态分配的对象内存时,析构函数会被自动调用。

比如在下面这个栈中:

3.3拷贝构造函数:

拷贝构造函数是一个特殊的构造函数,用于创建一个新的对象,该对象的内容是已有对象的一个副本,形式:(ClassName(const ClassName& obj));
 

       拷贝构造函数可以自定义实现,或者使用编译器自动生成的默认拷贝构造函数(当类没有显式定义拷贝构造函数时,编译器会自动生成一个默认的拷贝构造函数,该函数执行的是浅拷贝)。如果类中存在指针或其他资源,通常需要自定义拷贝构造函数,实现深拷贝。

代码示例:

class MyClass {
public:
    MyClass(); // 构造函数
    MyClass(const MyClass& obj); // 拷贝构造函数
    // 其他成员函数和成员变量

private:
    int data;
};

MyClass::MyClass() {
    // 构造函数的实现
}

MyClass::MyClass(const MyClass& obj) {
    // 拷贝构造函数的实现
    data = obj.data; // 执行深拷贝操作
}

3.4 对象的实例化:

      在程序中创建一个对象称为对象的实例化。对象的实例化可以通过调用类的构造函数来完成。构造函数负责为对象的成员变量分配内存并进行初始化,从而创建对象的实例。

3.5 对象的销毁:

      当对象不再被使用时,它会被销毁。对象的销毁可以通过调用类的析构函数来完成。析构函数主要用来释放对象占用的资源,清理对象的操作。对象销毁的时机通常是在对象超出其作用域、程序结束或者手动调用delete等情况下。

四、成员访问控制

4.1 公有成员:

      公有成员是指在类中声明为public的成员。公有成员可以被任何地方的代码访问,包括类的内部和外部。这意味着其他类和对象可以直接访问和修改公有成员。

在这张图片中public:后面的就是公有成员,其他类和对象可以直接访问和修改。

4.2 私有成员:

      私有成员是指在类中声明为private的成员。私有成员只能被同一个类的其他成员函数访问,不能被类的外部代码访问。私有成员用于实现类的封装,隐藏类的内部细节。

4.3 保护成员:

       保护成员是指在类中声明为protected的成员。保护成员可以被同一个类的其他成员函数和派生类的成员函数访问,但不能被类的外部代码访问。保护成员提供了一种在继承关系中,子类可以访问父类的成员,但其他类不能访问的机制。

#include <iostream>

class Base {
protected:
    int protectedData;

public:
    Base() : protectedData(0) {}

    void printProtectedData() {
        std::cout << "Protected Data: " << protectedData << std::endl;
    }
};

class Derived : public Base {
public:
    void setProtectedData(int newData) {
        protectedData = newData;
    }
};

int main() {
    Derived derivedObj;
    derivedObj.setProtectedData(10);
    derivedObj.printProtectedData();

    return 0;
}

      在这个例子中,Base 类中的 protectedData 是一个保护成员变量,只能在派生类中访问。Derived 类继承自 Base 类,并可以访问和修改 protectedData

      在 main 函数中,我们创建了一个 Derived 类的对象 derivedObj,并使用 setProtectedData 函数将 protectedData 设置为 10。然后,我们调用 printProtectedData 函数来输出 protectedData 的值。

       由于 protectedData 是一个保护成员变量,它不能在类的外部直接访问。只有派生类中的成员函数才能直接访问和修改它。因此,这个例子演示了如何使用保护成员来限制对类成员的访问。

五、类的封装性

5.1 封装的概念


        封装是面向对象编程中的一种基本原则,它指的是将数据和处理数据的代码包装在一起,形成一个独立的单元。这个单元称为类。

5.2 封装的好处
封装有以下几个好处:
1. 数据隐藏:

      封装可以隐藏对象的内部细节,只暴露出必要的接口给外部使用。这样可以防止外部代码直接访问对象的内部数据,提高了安全性和稳定性。

2. 代码复用:

       封装将相关的数据和方法组织在一起,形成一个独立的类。这样可以方便地复用代码,提高开发效率。

3. 模块化设计:

       封装让程序可以按照模块化的方式设计和构建。每个类都代表一个独立的模块,可以独立地开发、测试和维护。

4. 简化调用:

        封装可以把复杂的逻辑处理封装在类的内部,对外提供简单的接口。这样使用者不需要了解内部的复杂实现,只需要调用接口即可。

5. 可维护性:

       封装可以让代码更加可维护。因为内部数据和实现细节被封装起来,当需要修改时,只需要修改封装的类即可,不影响其他部分。

封装提供了一种清晰、安全、简洁和可维护的编程方式,使得面向对象编程更加灵活和高效。


总结

以上就是类和对象的前半部分,后续我会带来更多实用的内容,感兴趣的可以点个赞支持一下!

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

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

相关文章

上汽乘用车研发流程

目的 最近刚入职主机厂&#xff0c;工作中所提到各个阶段名称与之前在供应商那边不一致&#xff0c;概念有点模糊&#xff0c;所以打算学习了解一番 概念 术语 EP: enginerring prototype car 工程样车 Mule Car: 骡子车 Simulator Car&#xff1a;模拟样车 PPV&#xff1a;…

阿里云发现后门webshell,怎么处理,怎么解决?

当收到如下阿里云通知邮件时&#xff0c;大部分管理员都会心里一惊吧&#xff01;出现Webshell&#xff0c;大概是网站被入侵了。 尊敬的 xxxaliyun.com&#xff1a; 云盾云安全中心检测到您的服务器&#xff1a;47.108.x.xx&#xff08;xx机&#xff09;出现了紧急安全事件…

vite5.x配置https

旧版的vite直接在config里面配置https&#xff1a;true即可&#xff0c;新版的麻烦一些。 1.准备工作 需要安装openssl 下载地址&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 找到合适的版本安装&#xff0c;配置好环境变量&#x…

深度学习与计算机视觉 (博士)

文章目录 零、计算机视觉概述一、深度学习相关概念1.学习率η2.batchsize和epoch3.端到端(End-to-End)、序列到序列(Seq-to-Seq)4.消融实验5.学习方式6.监督学习的方式(1)有监督学习(2)强监督学习(3)弱监督学习(4)半监督学习(5)自监督学习(6)无监督学习(7)总结&#xff1a;不同…

在AI浪潮中,RSS3为何会被低估其价值?有何潜力

​​RSS3 简介&#xff1a; RSS3 是一个去中心化网络索引和结构化开放信息&#xff0c;使其对于下一个 Twitter、Google 和 OpenAI 来说易于访问且有价值。凭借独特的数据子层价值子层设计&#xff0c; RSS3 网络推动了开放信息从索引到消费等的全生命周期&#xff0c;并建立了…

BMS应用软件开发 — 3 电池系统的组成

目录 1 电池的基本拓扑 2 已经被淘汰的CTM 3 早已经普及的CTP 4 集成度更高的CTC 5 刚性更好的CTB 1 电池的基本拓扑 相比于燃油车&#xff0c;虽然电动车在结构空间上灵活度更高&#xff0c;空间利用率也更好&#xff0c;但现有条件下无法像燃油车一样快速补能&#xff…

UE5 打包要点

------------------------- 1、需要环境 win sdk &#xff0c;大约3G VS&#xff0c;大约10G 不安装就无法打包&#xff0c;就是这么简单。 ----------------------- 2、打包设置 编译类型&#xff0c;开发、调试、发行 项目设置-地图和模式&#xff0c;默认地图 项目…

高等数学学习笔记 ☞ 一元函数微分的基础知识

1. 微分的定义 &#xff08;1&#xff09;定义&#xff1a;设函数在点的某领域内有定义&#xff0c;取附近的点&#xff0c;对应的函数值分别为和&#xff0c; 令&#xff0c;若可以表示成&#xff0c;则称函数在点是可微的。 【 若函数在点是可微的&#xff0c;则可以表达为】…

Redis查询缓存

什么是缓存&#xff1f; 缓存是一种提高数据访问效率的技术&#xff0c;通过在内存中存储数据的副本来减少对数据库或其他慢速存储设备的频繁访问。缓存通常用于存储热点数据或计算代价高的结果&#xff0c;以加快响应速度。 添加Redis缓存有什么好处&#xff1f; Redis 基…

3D立体无人机夜间表演技术详解

3D立体无人机夜间表演技术是一种结合了无人机技术、灯光艺术和计算机编程的创新表演形式。以下是该技术的详细解析&#xff1a; 一、技术基础 1. 无人机技术&#xff1a; 无人机通常采用四旋翼设计&#xff0c;具有强大的飞行控制能力&#xff0c;可以实现前飞、后飞、悬停、…

MATLAB深度学习实战文字识别

文章目录 前言视频演示效果1.DB文字定位环境配置安装教程与资源说明1.1 DB概述1.2 DB算法原理1.2.1 整体框架1.2.2 特征提取网络Resnet1.2.3 自适应阈值1.2.4 文字区域标注生成1.2.5 DB文字定位模型训练 2.CRNN文字识别2.1 CRNN概述2.2 CRNN原理2.2.1 CRNN网络架构实现2.2.2 CN…

H2数据库在单元测试中的应用

H2数据库特征 用比较简洁的话来介绍h2数据库&#xff0c;就是一款轻量级的内存数据库&#xff0c;支持标准的SQL语法和JDBC API&#xff0c;工业领域中&#xff0c;一般会使用h2来进行单元测试。 这里贴一下h2数据库的主要特征 Very fast database engineOpen sourceWritten…

Android 10.0 授权app获取cpu温度和电池温度功能实现

1.前言 在10.0的系统定制化开发中&#xff0c;在开发某些产品的老化应用的时候&#xff0c;需要app获取cpu温度和电池 温度等功能&#xff0c;有些产品带温度传感器&#xff0c;大部分的产品都不包含温度传感器&#xff0c;所以就需要读取 sys下的相关节点来获取相关温度值 2.…

IDEA 撤销 merge 操作(详解)

作为一个开发者&#xff0c;我们都知道Git是一个非常重要的版本控制工具&#xff0c;尤其是在协作开发的过程中。然而&#xff0c;在使用Git的过程中难免会踩一些坑&#xff0c;今天我来给大家分享一个我曾经遇到的问题&#xff1a;在使用IDEA中进行merge操作后如何撤销错误的合…

WD5105同步降压转换器:9.2V-95V宽电压输入,4.5A大电流输出,95%高效率,多重保护功能

概述 • WD5105同步降压转换器 • 封装形式&#xff1a;QFN-20封装 • 应用场景&#xff1a;适用于车载充电器、电动车仪表、电信基站电源、电源适配器等 性能特点 • 输入电压范围&#xff1a;9.2V至95V • 输出电流&#xff1a;可提供4.5A连续负载电流 • 效率&#xff1a;高…

【C++】B2108 图像模糊处理

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述题目内容输入格式输出格式示例输入&#xff1a;输出&#xff1a; &#x1f4af;题目分析问题拆解 &#x1f4af;我的做法代码实现代码分析 &#x1f4af;老师的做法…

怎么把word试题转成excel?

在教育行业、学校管理以及在线学习平台中&#xff0c;试题库的高效管理是一项核心任务。许多教育工作者和系统开发人员常常面临将 Word 中的试题批量导入 Excel 的需求。本文将详细介绍如何快速将试题从 Word 转换为 Excel&#xff0c;帮助您轻松解决繁琐的数据整理问题&#x…

minibatch时,损失如何记录

目录 minibatch时&#xff0c;损失如何记录 报错&#xff1a;UnboundLocalError: local variable coef referenced before assignment是什么回事 未溢出则不会报错&#xff0c;可以完整滴运行完成 indent 缩进 炫酷技能&#xff1a;一遍运行&#xff0c;一遍画图 实例1 解释…

Linux : Linux环境开发工具vim / gcc / makefile / gdb / git的使用

Linux环境开发工具的使用 一、操作系统的生态二、程序下载安装&#xff08;一&#xff09;程序安装方式&#xff08;二&#xff09;包管理器 yum / apt 运行原理 三、文本编辑器 vim&#xff08;一&#xff09;认识vim 下的操作模式&#xff08;二&#xff09;命令模式常用的快…

国产游戏崛起,燕云十六移动端1.9上线,ToDesk云电脑先开玩

游戏爱好者的利好消息出新了&#xff01;网易大型武侠仙游《燕云十六声》正式官宣&#xff0c;移动端要在1月9日正式上线了&#xff01;你期待手游版的燕云吗&#xff1f;不妨评论区留言说说你的看法。小编分别花了几个小时在台式机电脑和手机上都试了下&#xff0c;欣赏画面还…