C++—类和对象

news2024/11/24 8:52:37

文章目录

  • 1 类
  • 2 对象
    • 2.1 创建对象
    • 2.2 对象的操作
    • 2.3 构造函数
    • 2.4 析构函数
  • 3 静态成员
  • 4 this指针
  • 5 友元

一切我们研究的事物,都可以叫做对象。对象具有状态,操作和行为。通常用一个数值来描述对象的状态。对象的操作用于改变对象的状态。对象和对象的操作就是对象的行为。

具有相同或相似性质的对象的抽象就是类。类有属性和操作。通常用数据结构来描述类的属性。类的属性是对对象状态的抽象。用用户名和实现操作的方法来描述类的操作。类的操作是对象行为的抽象。

1 类

C++中定义类的形式为

class 类的名字
{
	public:
		公有的数据成员定义
		公有的成员函数
	private:
		私有的数据成员定义
		私有的成员函数
};

类是由类头和类体两部分组成。类头就是class + 类名。类体就是花括号中的内容。类体一般包含两部分

  • 数据成员
    指定类对象的内部表示
  • 成员函数
    指定该类的操作

类的成员有三种不同的访问权限

  • 公有(public)
    成员可以在类外访问
  • 私有(private)
    成员只能被该类内的成员函数访问
  • 保护(protected)
    成员只能被该类的成员函数或派生类的成员函数访问

数据成员通常是私有的。成员函数通常有一部分是公有的,一部分是私有的。公有的成员函数可在类外被访问,也称为类的接口

类的成员函数通常在类外定义。类外定义类的成员函数的一般形式如下

返回类型 类名::函数名(输入参数)

在类外定义的成员函数,仍然需要在类内声明。

2 对象

类是用户定义的数据类型,不占内存单元。类存在于静态的程序中(即运行前的程序),而动态的面向对象程序(即运行中的程序)则由对象构成。程序的执行是通过对象之间相互发送消息来实现的,对象是类的实例(占内存单元)。

2.1 创建对象

对象与变量类似。在所有函数之外创建的对象,称为全局对象。在函数内创建的对象,称为局部对象。全局对象和局部对象的生存周期与全局变量和局部变量相同。通过new操作创建的对象,称为动态对象。动态对象需要用delete操作撤销。

以下内容来自C知道
new和delete是动态内存分配和释放的关键字。new可以创建一个指定类型的对象,并返回该对象的指针;delete可以释放一个指定的对象,并将该对象占用的内存返回给系统。这两个关键字经常被用来创建和删除对象。在使用new和delete的时候需要注意内存泄露和指针悬挂的问题。同时,在使用new动态分配内存时,还需要保证分配的内存空间不会超出系统的限制,否则会出现内存申请失败的情况。因此,在使用new和delete时需要谨慎考虑,以确保程序能正确地运行。

int* p = new int(5);
delete p;

2.2 对象的操作

对于创建的一个对象,需要通过调用对象类中定义的成员函数来对它进行操作。操作对象的一般形式为

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

或者

指向对象的指针->成员函数名(实参表)

这里通过一个简单的例子来展示一下对象的操作

#include<iostream>

using namespace std;

class temp
{
    public:
    	int a;   // 数据成员
    	
        // 成员函数
        void function1 ()
        {
            cout << "function1 is called!" << endl;
        }
        // 类外定义的成员函数的声明
        void function2 ();
};

// 类外成员函数
void temp::function2 ()
{
    cout << "function2 is called!" << endl;
}

int main()
{
    temp i;   // 创建一个temp类的局部对象
    temp* p;
    p = new temp;   // 创建一个temp类的动态对象,用p指向该对象
    
    // 调用成员函数对创建的对象进行操作
    i.function1();
    // 调用成员函数对创建的对象进行操作
    p->function2();
    delete p;
    
    return 0;
}

输出结果为

function1 is called!
function2 is called!

2.3 构造函数

程序运行时创建的每个对象只有在初始化后才能使用。对C++中定义了一种特殊的初始化函数,称之为构造函数。当对象被创建时,构造函数自动被调用。构造函数的名字与类名相同,它没有返回类型和返回值。当对象创建时,会自动调用构造函数进行初始化。当未定义构造函数,但是编译器需要嗲用构造函数时,编译器会自动生成默认的构造函数来初始化对象。因此,并不是所有的类都需要构造函数。这里看一个简单的例子

#include<iostream>

using namespace std;

class temp
{
    public:
    	int a;   // 数据成员
    	
        // 构造函数
        temp ()
        {
            a = 10;
        }
        // 成员函数
        void function1 ()
        {
            cout << a << endl;
        }
};

int main()
{
    temp i;   // 创建一个temp类的局部对象
    
    // 调用成员函数对创建的对象进行操作
    i.function1();
    
    return 0;
}

输出结果为10。如果不定义构造函数,输出结果为0。需要注意的是,对构造函数的调用是对象创建过程的一部分,对象创建之后就不能再调用构造函数了。

2.4 析构函数

当对象销毁时,会自动调用析构函数进行一些清理工作。析构函数也与类同名,但在名字前有一个“~”,析构函数也没有返回类型和返回值。析构函数不带参数,不能重载。析构函数的调用顺序与构造函数的调用顺序相反。下面通过一个简单的例子来理解一下

#include<iostream>

using namespace std;

class temp
{
    
    public:
        // 构造函数
        temp ()
        {
            cout << "构造函数被调用" << endl;
        }
        // 析构函数
        ~temp()
        {
            cout << "析构函数被调用" << endl;
        }
};

int main()
{
    temp i,j;   // 创建temp类的局部对象
    cout << "main函数" << endl;
    
    return 0;
}

输出结果为

输出结果

3 静态成员

定义静态成员的方法比较简单,直选要在成员变量和成员函数前增加一个“static”即可。静态成员有以下特点

  • 静态成员被类的所有对象共享。不会随着对象的创建而被多次创建和初始化。
  • 静态函数仅能访问静态的数据成员
  • 静态成员变量只能在类外进行初始化
  • 公有的静态成员可以通过“类名::成员函数(输入参数)/成员变量”进行调用和访问
#include<iostream>

using namespace std;

class temp
{
    public:
        int a;   // 数据成员
        
        // 构造函数
        temp ()
        {
            a = 10;
        }
};

int main()
{
    // 通过对象访问成员变量
    temp i;   // 定义一个temp类的对象
    
    cout << "a=" << i.a << endl;
    
    return 0;
}

如果a是静态成员,还可以通过“类名::成员变量名”访问成员变量。

#include<iostream>

using namespace std;

class temp
{
    public:
        static int a;   // 数据成员
};

// 静态变量只能在类外进行初始化
int temp::a = 10;

int main()
{
    // 通过对象访问成员变量
    temp i;   // 定义一个temp类的对象
    
    cout << "a=" << i.a << endl;
    
    // 通过类名访问成员变量
    cout << "a=" << temp::a << endl;
    
    return 0;
}

4 this指针

在介绍this指针前,先看一个简单的小例子

#include<iostream>

using namespace std;

class temp
{
    public:
        void function (int m)
        {
            a = m;
            cout << "a=" << a << endl;
        }
    
    private:
        int a;
        int b;
};

int main()
{
    temp i;   // 定义一个类temp的对象
    
    i.function(1);
    
    return 0;
}

输出结果为

a=1

现在考虑一个问题,对于类函数function,它是怎么知道是对哪一个对象进行操作呢?这就需要this指针来告诉它。

  • this指针指向当前对象,可以访问当前对象的所有成员变量。包括private、protected、public。
  • this指针是const指针,不可以被赋值和修改。
  • this指针只有在类的非静态成员函数中有定义,仅在类的成员函数中访问。

实际上面的函数可以写成

void function (temp* const this,int m)
{
	this -> a = m;
}

5 友元

C++中为了保护数据,使用private访问控制,来限制类外对类内数据成员的访问。C++中可以指定某个全局函数、某个其他类或某个其他类的成员函数来直接访问该类的私有 (private) 和保护 (protected) 成员,它们分别称为友元函数、友元类和友元类函数,通称为友元。友元的作用是提高程序设计的灵活性,是数据保护和对数据的存取效率之间的一种折中方案。

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

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

相关文章

BlueZ 开发学习指南(一) --- D-Bus介绍

BlueZ 开发学习指南&#xff08;一&#xff09; — D-Bus介绍 一、 BlueZ与D-Bus简介 Linux使用的蓝牙协议栈是Blue Z&#xff0c;不同于我们以往的开发方式&#xff0c;Blue Z提供的API 并不是通过头文件这样的形式&#xff0c; 而是通过D-Bus的方式来提供的。 Blue Z提供的是…

AutoDL 训练stable-diffusion lora模型

1.创建镜像实例 2. 启动实例 3.启动服务 4.配置参数 4.1 基础模型选择 4.2 文件路径设置 5.点击打印训练信息 6.训练模型&#xff08;点击Train model&#xff09;

C++ 迭代器的设计与使用

C 迭代器是一种用于访问容器&#xff08;例如数组、向量、列表等&#xff09;元素的工具。它们允许我们以一种统一的方式遍历和操作容器中的数据&#xff0c;而不用关心容器内部数据结构的细节 C 迭代器 std 重要函数 std::begin 和 std::endstd::advance(iter,n)向前移动…

从零开始,用Python编写EA实战指南

在外汇交易领域&#xff0c;EA&#xff08;Expert Advisor&#xff09;是一种基于计算机程序的交易策略&#xff0c;被广泛应用于机器人化交易和量化交易。Python作为一种高效、灵活的编程语言&#xff0c;被越来越多的投资者用于编写EA和数据分析。本文将提供一份从零开始&…

Postgresql在哪里使用列统计信息?

对pg_statistic表的查询都是走syscache的&#xff0c;要找到所有使用列统计信息地方&#xff0c;遍历系统表索引即可 enum SysCacheIdentifier {...STATEXTDATASTXOID,STATEXTNAMENSP,STATEXTOID,STATRELATTINH,... }下面是最常用的STATRELATTINH索引场景&#xff0c;即 Sear…

行业追踪,2023-07-13,新样式来了,更清晰地追踪行业趋势

自动复盘 2023-07-13 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

利用 Elasticsearch、ESRE、LLM 和 LangChain 加速制药行业的研发 — 第 1 部分

作者&#xff1a;Valerio Arvizzigno, Dimitri Marx, Francesco Di Stefano 这是一篇通过生成式 AI/LLM、自定义模型和 Elasticsearch 相关性引擎 (ESRE​​) 支持制药行业更快的药物创新和发现的综合指南。更快的药物发现带来有前途的候选药物是制药行业的主要目标。 为了支持…

Mysql表空间、段、区、页的关系

提示&#xff1a;mysql表空间、段、区、页的关系详细描述 文章目录 表空间-TABLE SPACE1 查看 表空间相关参数段&#xff08;segment&#xff09;区&#xff08;extent&#xff09;页&#xff08;page&#xff09; 表空间-TABLE SPACE 从 InnoDB 逻辑存储结构来看&#xff0c;…

顺序表 --- C语言实现

目录 1.线性表 2.顺序表 2.1 概念和结构 2.2 接口实现 2.3 数组相关面试题 2.4 顺序表的问题及思考 1.线性表 什么是线性表 &#xff1a; 线性表&#xff08;linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常…

Vue3 概述

文章目录 Vue3 概述概述Vue3对比Vue2优势使用create-vue创建项目概述创建项目目录结构 使用vue-cli创建项目概述创建项目目录结构 Vue3 概述 概述 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript…

自定义指令directives:防抖,节流,element-ui的无限滚动在el-table上使用的封装

vue官网对于自定义指令的介绍 添加链接描述 除了核心功能默认内置的指令 (v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令。注意&#xff0c;在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对普通 DOM…

分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)

目录 可靠消息最终一致性分布式事务实现_RocketMQ事务消息 可靠消息最终一致性分布式事务实战_案列业务介绍 数据库表设计 可靠消息最终一致性分布式事务实战_Docker安装 RocketMQ 部署RocketMQ的管理工具 可靠消息最终一致性分布式事务实战_实现订单微服务 可靠消息最终一…

分层解耦-IOCDI-DI详解

目录 Bean注入 小结 依赖注入的注解 Resource和Autowired区别 Bean注入 Autowired注解&#xff0c;默认是按照类型进行依赖注入&#xff0c;如果存在多个相同类型的bean就会报错 解决方案 Primary&#xff08;设置bean的优先级&#xff09; Qualifier&#xff08;通过bean…

简单版本视频播放服务器V1

一直想做个家用版本的视频播放器&#xff0c;通过这个可以实现简单的电脑&#xff0c;通过浏览器就是可以访问电脑里面的视频&#xff0c;通过手机&#xff0c;平板等都是可以访问自己的视频服务了 后端代码&#xff1a; package mainimport ("fmt""io/iouti…

2023年7月13日 星期四 Linux驱动作业

1.使用platform驱动实现代码实现如下要求 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变(按键中断) 例如number0 按下按键number1再次按下按键number0d.在按下按键的时候需要同时将1ed1的状态取反 t e.驱动…

Tik Tok你不知道的那些知识?

TikTok是一款短视频社交平台&#xff0c;由中国公司字节跳动&#xff08;ByteDance&#xff09;开发和运营。它让用户可以通过手机拍摄、编辑和分享15秒至60秒的短视频&#xff0c;涵盖了各种内容&#xff0c;包括音乐、舞蹈、喜剧、唱歌、游戏等。TikTok以其简单易用和丰富多样…

Meteor code must always run within a Fiber 报错解决办法

报错&#xff1a; 这样的写法会出现这个报错 大概的意思就是说&#xff0c;目前你这个函数不是运行在meteor的环境中&#xff0c;所以要使用Meteor.bindEnvironment&#xff0c;来改变函数运行的上下文 解决办法&#xff1a;

87. 把字符串转换成整数

目录 链接&#xff1a; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 图片&#xff1a; 链接&#xff1a; 原题链接 题目&#xff1a; 请你写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。 当然&#xff0c;不能使用 atoi 或者其他类似的库函数…

摆脱基础设施束缚,亚马逊云科技提出生成式AI方法论

“未来近在咫尺&#xff0c;只不过时隐时现 (The future is here, its just not evenly distributed yet.)”--亚马逊云科技全球产品副总裁Matt Wood博士引用“赛博朋克之父” William Gibson 的一句名言来表达生成式AI的发展现状。 自去年底ChatGPT惊艳众人开始&#xff0c;这…

云原生高性能API网关,选Apache APISIX还是Nginx Plus

文章首发地址 Apache APISIX 对比 Nginx Plus APISIX 和 Nginx Plus 都是高性能的 API 网关&#xff0c;具有类似的特点&#xff0c;如可扩展性、插件化、负载均衡、反向代理等。下面对 APISIX 和 Nginx Plus 进行对比&#xff1a; 开源授权&#xff1a;APISIX 是 Apache 开…