c++

简介: 类与对象

类与对象(上)

1.面向对象与过程的区别

C语言是面向过程的语言,求解问题的步骤

而C++是面向对象的语言,更关注的是对象

2.类的引入

c语言中,结构体==只能==定义变量,而C++中,结构体不仅可以定义变量,也可以定义函数

3.类的定义

//1.成员变量   2.成员函数
class    类名
{

};                     //注意分号

?定义在类的函数默认为内联函数?

2.声明放在.h的文件中,定义放在.cpp中

C语言中struct是用来定义结构体的

C++兼容C语言的struct的用法,但是同时struct也可以用来定义类。

类的成员前面最好加个_,来表示是成员

添加其他定义:

​ 高内聚 低耦合

现在 类内部成员间的关系 类和类之间的关系

以后更多指的是模块间的关系

4.类的访问限定符及封装

4.1

私有的只能在类里面访问

可以定义多个公有私有。

4.2封装

面向对象的三大特性:封装,继承,多态。

封装:

1.将数据和方法放到定义一起

2.把想给你看到的数据给你看,不想给你看的封装起来

5.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员,需要使用==::==作用域解析符指明成员属于那个类域。

6.类的实例化

【问题】:声明和定义的区别?

声明是一种承诺,承诺要干嘛, 但是还没做,定义就是把这个事落地了

类实例化出对象,定义出对象,占有物理空间

类名+名字;

实例化-->就是用自己定义的类型定义出对象

1.内置类型,基本类型

2.自定义类型:class和struct;

类里面的函数定义有两种办法:

1.在类里面定义

2.在类里面声明,在类外面定义,注意要加::

7.类对象模型

7.1计算类的大小

对象中只储存成员变量,不储存成员函数?

一个类实例化出N个对象,每个对象的成员变量都可以存储不同的值,但是调用的函数确是同一个

如果每个对象都放成员函数,而这些成员函数都是一样的,造成空间的浪费

==成员函数不占大小,成员函数在公共代码段,函数没有存在对象里面==

1.如何计算一个类实例化出的对象的大小,计算成员变量之和,并且考虑 内存对齐规则;

每个成员变量都有一个对齐数,这个对齐数=min(自己的大小,默认对齐数)

内存对齐?4字节的倍数

2.没有成员变量的类的大小是1,而不是0,开一个字节不是为了存数据,而是占位表示对象存在

7.3结构体内存对齐规则

8.隐含的this指针

谁调用这个成员函数,this指针就指向谁的地址

【问题】:

1.this指针存在哪里?(也就是存在进程地址空间的哪个区域?)

存在栈上,因为它是一个形参(vs下进行了优化,在ecx寄存器来传递)

2.this指针可以为空吗?

硬件存储体现

寄存器

缓存( 一般的电脑都是L1/L2/L3三级缓存)

内存

硬盘 (机械硬盘,SSD SSD相对更快/价格贵) ==越往上越小越贵==

远程网络储存

类和对象(中)

1.类的6个默认成员函数

1.我们不实现时,编译器生成的默认构造函数和析构函数,针对成员变量,==内置类型就不处理,自定义类型会调用这个成员对象的构造和析构

2.我们不实现时,编译器生成拷贝构造和operator=,会完成按字节的值拷贝(浅拷贝)

浅拷贝和深拷贝:

浅拷贝:按照字节一个一个拷贝过去。俩个指向的是同一块内存空间

深拷贝:

2.构造函数

2.1概念

构造函数->在对象构造时调用的函数,这个函数完成出初始化工作,并不是开空间创建对象。在对象初始化,自动调用

特征有:

1.函数名与类名相同

2.无返回值

3.对象实例化时编译器自动调用对应的构造函数

4.构造函数可以重载

#include<iostream>
using namespace std;
class    Date
{
public: 
    //构造函数->在对象构造时调用的函数,这个函数完成初始化工作
    Date(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    Date()
    {
        _year = 0;
        _month = 0;
        _day = 0;
    }
    void Init(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    void Print()
    {
        cout << _year << "-" << _month << "-" << _day<<endl;
    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    Date  d1(2023, 7, 18);
    d1.Print();

    Date d2;                                //注意,这里不能加括号d2后面不能加括号
    d2.Print();

};

5.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成,必须自己重新定义一个无参的,可以利用全缺省(notice?)

默认生成无参构造函数(==notice==)

1.针对内置类型的成员变量没有做处理

2.针对自定义类型的成员变量,调用它的构造函数初始化(code)

进行代码的编程的优化,有参和无参的结合,全缺省

6.无参的构造函数和全缺省的构造函数都成为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数,全缺省构造函数,我们没写编译器默认生成的构造函数,都可以是默认构造函数

默认构造函数有三种形式,但实际的代码只能存在一种形式。

3.析构函数

3,1概念

对象在销毁时会自动调用析构函数,完成类的一些资源清理工作,析构函数不是完成对象的销毁,清理资源。析构的顺序是先析构购入的对象。

3.2特征

析构函数是特殊的成员函数

特征如下:
1.析构函数名是在类名前加上符号"~"

2.无参数无返回值

3.一个类有且只有一个析构函数,若未显式定义,系统会自动生成默认的析构函数

4.对象生命周期结束时,c++编译系统自动调用析构函数。

5.我们不写,编译器生成的构造函数和析构函数

内置类型/基本类型 int/char 不会处理

自定义类型 调用它的构造函数初始化/析构函数

4.拷贝构造函数

调用拷贝函数之前要传参

question

基于Date d2(d1)

Date(Date d)

调用的就是拷贝构造

但是在调用函数时要先传参数

传参的过程又是一个拷贝构造的调用

传引用可以解决这样的问题,但建议const;防止有意外产生。因为引用有不安全因素

4.1概念

构造函数,只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),用已存在的类类型对象创建新对象时由编译器自动调用

4.2特征

如下:

1.拷贝构造函数是构造函数的一个重载形式

2.拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用

3.

4.

5赋值运算符重载

5.1运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有返回值类型

函数名字为: 关键字operator后面接需要重载的运算符符号

函数类型 : 返回值类型operator操作符(参数列表)

注意事项:

1.不能链接其他符号来创建新的操作符,例如operator@

2.重载操作符必须有一个类类型或者枚举类型的操作数

3.用于内置类型的操作符,其含义不能改变

4.用作类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参

  1. , .*,::,sizeof,?:,. 5个运算符不能重载

有个复用的方法

5.2赋值运算符重载

6.日期类的实现

7.const成员

CONST修饰指针

const Date* p1;          //*p1,指向的对象
Date const * p2;         //*p2,指向的对象
Date* const p3;          //->p3,指向本身
//*之前的都是对象,*之后的是指针本身

非const可以调用const,属于权限的缩小

类中成员函数中不直接或者间接修改成员变量,都建议加上const

8.取地址及const取地址操作符重载

const Date* operator&()     //const Date*
{
return this;          //const Date*
}

类和对象(下)

1.再谈构造函数

1.1函数体内赋值:

_year=year;
_month=month;
_day=day;

1.2初始化列表:

;_year(year)
,_month(month)
,_day(day)             //注意格式

使用的条件

1.引用

2.const

3.没有默认构造函数(不用传参就可以调的那个构造函数)

注意:

成员变量在初始化列表按照声明的顺序进行初始化,不是初始化列表出现定义的顺序

1.3explict关键字

防止类构造函数的因式自动转换,只能对一个参数操作

2.static成员

2.1概念

修饰成员变量或者成员函数

静态的成员变量一定要在类外面进行初始化。

出题:实现一个类,计算程序中创建了多少个类对象

2.2特性

静态成员函数没有this指针,不能访问任何非静态成员,可以不使用的对象来调用

根据书上总结

3.static成员函数中,不能访问非静态的成员(成员变量+成员函数)

非静态成员函数可以调用类的静 态成员函数,类里面不受访问限定符的限制

有个任务,1到n的新玩法

3.C++11的成员初始化新玩法

4.友元

友元分为两类:友元函数和友元类

4.1友元函数

4.2友元类

5.内部类

5.1概念及特性

相关文章
|
23天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2576 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
163 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
972 14
|
3天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
218 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
734 9