C++学习日记 | Lecture 9 类基础

news2024/9/23 21:20:40

资料来源:南科大 余仕琪 C/C++ Program Design

LINK:

  1. CPP/week09 at main · ShiqiYu/CPP · GitHub
  2. 9.1-classes-and-objects_哔哩哔哩_bilibili
  3. 9.2-constructors-and-destructors_哔哩哔哩_bilibili
  4. 9.3-this-pointer_哔哩哔哩_bilibili
  5. 9.4-const-and-static-members_哔哩哔哩_bilibili

0 概述

       本节主要介绍类的基本内容,主要包括类定义、构造函数和析构函数、类的使用、以及this指针。

1 Classes and Objects 类和对象

  • 操作结构体的数据十分危险,存在数据越界、写入不合规范的数据却无法察觉等问题。
  • 使用类进行操作可以很好的解决以上问题。类主要包括成员变量和成员函数。通过成员函数的编写可以更好的规避操作数据中的错误

  • 在前面的例子中,我们的成员变量是public类型的。这使得我们并不需要调用成员函数就可以直接外部改变变量的值。一般来说,在类里面我们使用的是private类型的成员变量,pubilc类型的成员函数。这使得我们只能通过调用成员函数来修改。
  • 如果不写private,默认为private。
  • 如果是private却不用成员函数,直接外部调用,编译环节会直接报错

  • 成员函数可以放在类的里面或者类的外面。放在里面的函数默认为inline函数。
  • 简单的函数可以放在类里面,复杂的函数(比如打印输出等)则放在外面,这样可以使函数变得更为简洁。
  • 成员函数如果放在外面需要加上类的名字,否则就是普通函数。

  •  在C++中一般选择将函数和main分开来放,这样显得程序整体的结构更为清晰。

2 构造函数和析构函数

2.1 构造函数

  • C++ 中的构造函数是类的一种特殊成员函数,它在每次创建类的新对象时自动执行。构造函数的名称与类的名称相同,不返回任何类型,也不返回 void。它的主要作用是初始化对象的数据成员。
  • 相对于C语言的结构体而言,C++的类在分配内存后需要调用构造函数。如果没有调用构造函数,编译器会自动生成一个空的构造函数,如下所示。
class Line {
public:
    Line(); // 这是构造函数
private:
    double length;
};

Line::Line() {
    cout << "Object is being created" << endl;
}

  •  一个类里可以有多个构造函数,只需要参数不同即可。这些构造函数也称为重载构造函数。

  •  变量初始化也可以写成以下简洁形式

 2.2 析构函数

  • 析构函数(destructor)在 C++ 中是一种特殊的成员函数,与构造函数相反。当对象结束其生命周期,例如对象所在的函数已调用完毕时,系统会自动执行析构函数。它的主要作用是进行一些“清理善后”的工作,例如释放对象创建时申请的内存空间。
  • 析构函数只能有一个,不可以重载。
  • 与构造函数类似,析构函数无返回值,没有参数列表,且只能有一个析构函数。

  • delete:这个运算符用于释放单个对象指针指向的内存。
  • delete []:这个运算符用于释放对象数组指针指向的内存。它会为数组中的每个元素调用析构函数,然后释放内存。

3 this 指针

  • 在 C++ 中,this 指针是一个特殊的指针,它指向当前对象的实例。每一个对象都能通过 this 指针来访问自己的地址。这个隐藏的指针可以在类的成员函数中使用,用来指向调用该函数的对象。当一个对象的成员函数被调用时,编译器会隐式地传递该对象的地址作为 this 指针
  • 有了this指针,就可以特指当前对象的成员变量或成员函数去调用
this->born 这个born是 成员变量born

4 const 和 static 成员

4.1 const

  • 回顾const声明

  • c++中不推荐用第一种 #define 类型的宏定义来定义常量,都使用const来定义。
  • const int * p_int;:这表示 p_int 是一个指向常量整数的指针。具体来说:

  1. p_int 可以指向不同的整数变量,但是不能通过 *p_int 修改所指向的整数的值。
  2. 例如,*p_int = 42; 是非法的,因为 p_int 所指向的整数是常量。
  • int const * p_int;:这与上面的声明相同,也表示 p_int 是一个指向常量整数的指针。const 关键字在 int 前后都可以放置,效果相同。

  • int * const p_int;:这表示 p_int 是一个指向整数的常指针。具体来说:

  1. p_int 的值(即所指向的内存地址)不能改变,一旦初始化,就不能再指向其他地方。
  2. 但是,可以通过 *p_int 修改所指向的整数的值。

  • 成员里面也可以定义常量。可以是成员变量或者是成员函数。作为成员函数时,不能对变量进行修改。

4.2 static

静态成员(static members)包括静态成员变量和静态成员函数。它们有一些独特的特性和用途:

静态成员变量

  1. 定义和声明

    • 静态成员变量在类中声明,但必须在类外定义。
    • 使用关键字static进行声明。
    class MyClass {
    public:
        static int staticVar;
    };
    
    // 在类外定义
    int MyClass::staticVar = 0;
    
  2. 共享性

    • 静态成员变量在所有对象之间共享,所有对象访问的是同一个变量。
    • 修改一个对象的静态成员变量会影响所有对象。
  3. 生命周期

    • 静态成员变量在程序开始时分配内存,并在程序结束时释放。

静态成员函数

  1. 定义和声明

    • 静态成员函数使用关键字static进行声明。
    • 它们不能访问类的非静态成员变量或非静态成员函数。
    class MyClass {
    public:
        static void staticFunction();
    };
    
    void MyClass::staticFunction() {
        // 只能访问静态成员变量
        staticVar = 10;
    }
    
  2. 调用方式

    • 静态成员函数可以通过类名直接调用,不需要创建对象。
    • 也可以通过对象调用,但不推荐。
    MyClass::staticFunction(); // 推荐
    MyClass obj;
    obj.staticFunction(); // 也可以,但不推荐
    

用途

  • 静态成员变量:常用于需要在所有对象之间共享数据的场景,例如计数器、配置参数等。
  • 静态成员函数:常用于不依赖于对象实例的操作,例如工厂方法、实用工具函数等。

静态成员变量和普通成员变量在C++中有几个关键区别:

  1. 归属

    • 静态成员变量:属于类本身,而不是类的某个对象。所有对象共享同一个静态成员变量。
    • 普通成员变量:属于类的某个对象,每个对象都有自己独立的普通成员变量。
  2. 定义和声明

    • 静态成员变量:在类中声明,但必须在类外定义。
      class MyClass {
      public:
          static int staticVar;
      };
      
      int MyClass::staticVar = 0; // 在类外定义
      
    • 普通成员变量:在类中声明和定义。
      class MyClass {
      public:
          int nonStaticVar;
      };
      
  3. 访问方式

    • 静态成员变量:可以通过类名直接访问,也可以通过对象访问。
      MyClass::staticVar = 10; // 通过类名访问
      MyClass obj;
      obj.staticVar = 20; // 通过对象访问
      
    • 普通成员变量:只能通过对象访问。
      MyClass obj;
      obj.nonStaticVar = 30;
      
  4. 生命周期

    • 静态成员变量:在程序开始时分配内存,并在程序结束时释放。
    • 普通成员变量:在对象创建时分配内存,并在对象销毁时释放。
  5. 共享性

    • 静态成员变量:在所有对象之间共享,修改一个对象的静态成员变量会影响所有对象。
    • 普通成员变量:每个对象都有自己独立的副本,修改一个对象的普通成员变量不会影响其他对象。

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

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

相关文章

好用的《身份证工具》插件,解锁6大实用功能

在数据处理领域&#xff0c;超级处理器插件凭借其强大的功能和高效的性能&#xff0c;一直是Excel和WPS用户的心头好。而今&#xff0c;这一优秀插件再次迎来革新——身份证工具功能现已支持单独安装使用&#xff0c;为用户带来前所未有的便利与灵活性。 超级处理器下载与安装…

matlab入门学习

一、什么是matlab MATLAB&#xff08;matrix laboratory矩阵实验室&#xff09;是一款商用数学软件&#xff0c;主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。可用于数据分析、深度学习、图像处理与计算机视觉、量化金融与风险管理等领域。 二、matlab和pyt…

快速在springboot项目中应用EasyExcel

目录 ​编辑一、介绍 二、准备工作 三、初始化项目 3.1 创建项目 3.2 引入依赖 3.3 创建数据库和数据表 3.4 编写application.properties文件 四、开始编写 4.1 目录结构 4.2 MyBatis配置类 4.3 用户实体类 4.4 mapper接口 4.5 编写数据操作文件 4.6 编写Service 业…

静态链接——编译和链接

一、编译和链接的过程 1、GCC生成可执行文件的总体过程 在日常的开发过程中&#xff0c;IDE总是会帮我们将编译和链接合并&#xff0c;一键式的执行,即使在liunx中&#xff0c;使用命令行来编译一个源文件也只是简单的一句"gcc hello.c"。我们并没有过多的关注编译和…

linux的学习(五):shell编程中的变量,运算符,条件判断

简介&#xff1a; shell编程的基本概念&#xff0c;定义变量&#xff0c;运算符&#xff0c;条件判断的基本使用 shell编程 把多个命令写到一个文件里&#xff0c;这个文件就是脚本&#xff0c;里面还有很多的流程控制 基本概念 脚本的后缀名是.sh 脚本的执行&#xff1a;…

全面理解Spring6框架到熟悉与掌握

个人笔记梳理&#xff0c;仅供参考 Spring是一款主流的JavaEE轻量级开源框架 Spring的狭义和广义 广义的Spring&#xff1a;Spring技术栈 泛指以Spring Framework为核心的Spring技术栈 经过十多年的发展&#xff0c;Spring已经不再是一个单纯的应用框架&#xff0c;而是逐…

EasyAnimate-v3版本支持I2V及超长视频生成

阿里云人工智能平台&#xff08;PAI&#xff09;自研开源的视频生成项目EasyAnimate正式发布v3版本&#xff1a; 支持 图片&#xff08;可配合文字&#xff09; 生成视频 支持 上传两张图片作为起止画面 生成视频 最大支持720p&#xff08;960*960分辨率&#xff09; 144帧视…

量化投资基础(一)之均值方差模型一

点赞、关注&#xff0c;养成良好习惯 Life is short, U need Python 量化投资基础系列&#xff0c;不断更新中 1. 投资组合收益率与风险 假设市场有 N N N 个资产&#xff0c;其随机收益率分别为 R 1 , R 2 , … , R N R_1,R_2,\dots,R_N R1​,R2​,…,RN​ &#xff0c;对应…

蓝桥 双周赛算法赛【小白场】

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 蓝桥第14场小白入门赛T1/T2/T3 题目&#xff1a; T1照常还是送分题无需多…

【Git的基本操作】版本回退 | 撤销修改的三种情况 | 删除文件

目录 5.版本回退 5.1选项hard&后悔药 5.2后悔药&commit id 5.3版本回退的原理 6.撤销修改 6.1情况一 6.2情况二 6.3情况三 ​7.删除文件 Git重要能力之一马&#xff0c;版本回退功能。Git是版本控制系统&#xff0c;能够管理文件历史版本。本篇以ReadMe文件为…

STM32智能楼宇照明系统教程

目录 引言环境准备智能楼宇照明系统基础代码实现&#xff1a;实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…

Vue3新特性:Teleport、Suspense玩转起来!

Vue3新特性&#xff1a;Teleport、Suspense玩转起来&#xff01; 嘿&#xff0c;各位前端小伙伴们&#xff01;今天咱们来聊聊Vue3中的两个新特性&#xff1a;Teleport和Suspense。这两个功能听起来像是从科幻电影里跑出来的&#xff0c;但实际上它们可是能让我们的代码更加优…

Leetcode - 周赛405

目录 一&#xff0c;3210. 找出加密后的字符串 二&#xff0c;3211. 生成不含相邻零的二进制字符串 三&#xff0c;3212. 统计 X 和 Y 频数相等的子矩阵数量 一&#xff0c;3210. 找出加密后的字符串 本题是一道模拟题&#xff0c;代码如下&#xff1a; class Solution {pu…

力扣27.移除元素(Java)

思路&#xff1a; 使用双指针&#xff0c;其中一个指针用来寻找不同val的下标&#xff0c;另一个指针用来赋值 class Solution {public int removeElement(int[] nums, int val) {int left0;//用来赋值的指针for(int right0;right<nums.length;right){//用来寻找不同与val…

[Linux]Linux编译器gcc/g++

首先我们需要明确概念gcc只能用来编译c语言&#xff0c;g即可用来编译c语言&#xff0c;又可用来编译c,但我们一般用gcc编译c,g编译c 一、gcc的使用 当我们写好代码以后可以直接 gcc test.c然后它会自动生成一个可执行程序a.out这个可执行程序的名字不重要&#xff0c;关键是…

醇香之旅:探索红酒的无穷魅力

在浩渺的饮品世界里&#xff0c;红酒如同一颗璀璨的星辰&#xff0c;闪烁着诱人的光芒。它以其不同的醇香和深邃的韵味&#xff0c;吸引着无数人的目光。今天&#xff0c;就让我们一起踏上这场醇香之旅&#xff0c;探索雷盛红酒所带来的无穷魅力。 一、初识红酒的醇香 当我们…

vue3前端页面下载excel模版

1.excel上传到public目录下 2.代码中引用excel路径 <el-space direction"horizontal" size"small"><el-button click"handleChangePage">刷新列表</el-button><el-button type"primary" click"handleBatch…

【第2章】Spring Cloud之Nacos服务端安装

文章目录 前言一、预备环境准备二、下载源码或者安装包1. 从 Github 上下载源码方式2.下载编译后压缩包方式(推荐)3. 目录结构4. 启动服务器5. 访问控制台6. 关闭服务器 总结 前言 Nacos 通过提供简单易用的动态服务发现、服务配置、服务共享与管理等服务基础设施&#xff0c;…

[日进斗金系列]用码上飞解决企微开发维修管理系统的需求

前言&#xff1a; 今天跟大家唠唠如何用小money生 大money的方法&#xff0c;首先我们需要准备一个工具。 这个工具叫码上飞CodeFlying&#xff0c;它是目前国内首发的L4级自动化智能软件开发平台。 它可以在短时间内&#xff0c;与AI进行几轮对话就能开发出一个可以解决实际…

【React打卡学习第一天】

React入门 一、简介二、基本使用1.引入相关js库2.babel.js的作用 二、创建虚拟DOM三、JSX&#xff08;JavaScript XML&#xff09;1.本质2.作用3.基本语法规则定义虚拟DOM时&#xff0c;不要写引号。标签中混入JS表达式时要用{}。样式的类名指定不要用class,要用className.内联…