[C++]——带你学习类和对象

[C++中类与对象 cpp] -> C++面向对象编程进阶:深入学习类与对象 在C++中,我们需要使用class关键字来定义一个类。类的定义包含了类的成员变量和成员函数。成员函数可以是公有(public)的、私有(private)的或受保护(protected)的。公有成员可以在类外部被访问,私有成员只能在类内访问,受保护成员可以在类及其子类中访问。public:// 公有成员函数private:// 私有成员变量int age; 阅读详情

目录:

写完这篇,类和对象这座小山就翻完了。继续加油!

一、构造函数补充

1.1构造函数初始化

在这里插入图片描述

构造函数体中的语句只能将其称为赋初值,而不能称作初始化,因为初始化只能初始化一次,而构造函数体内可以多次赋值。(默认构造有3个,系统默认生成的构造函数,无参的构造函数,全缺省的构造函数)

1.2构造函数初始化列表

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。
案例:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
//日期类
class Time
{
public:
    //初始化列表
    Time(int hour=1,int minute=1,int secnd=1)
        :_hour(hour),
        _minute(minute),
        _second(secnd)
    {}
private:
    int _hour;
    int _minute;
    int _second;
};
class Date
{
    //公有
public:
    Date(int year=1970, int month=1, int day=1)
        :_year(year),
        _month(month),
        _day(day),
        time()
    {
    }
//私有
private:
    int _year;
    int _month;
    int _day;
    Time time;
    const static size_t npos=-1;//静态变量加个const,这是一个特例,需要特殊处理,可以给缺省值,但是这个数必须是整型
};
int main()
{
    Date d;
    Date d3(2023, 11, 25);
    return 0;
}

初始化列表解决的问题:
1——每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)。
2——引用,const,没有默认构造函数的自定义成员,必须在初始化列表中显示定义。,有些自定义类型成员想要自己控制,也尽量使用初始化列表来初始化。
缺省值相当于是给初始化列表;如果自定义类型成员去调用它的默认构造函数,内置类型初始化,值是随机值。
3——构造函数不能只要初始化列表不要函数体赋值,他们可以混合着用。
4——初始化列表就是成员函数定义的地方,建议声明顺序和初始化列表一致,避免出现理解问题。

1.3explicit关键字

单参数的情况(c++98支持)

#include <iostream>
using namespace std;
class Date
{
    //公有
public:
  Date(int year , int month = 1, int day = 1)
        :_year(year),
        _month(month),
        _day(day)
    {
    }
  //加上explicit关键字,禁止构造函数发生隐式转换
 /* explicit Date(int year, int month = 1, int day = 1)
      :_year(year),
      _month(month),
      _day(day)
  {
  }*/
    //私有
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    Date d1(2024);//构造函数
    //只要是类型转换就会生成临时变量,临时变量具有常属性。
    Date d2=2024;//构造函数+拷贝构造+优化——>构造函数(发生了隐式类型转化)//c++98
    return 0;
}

多参数的情况(c++11支持)

#include <iostream>
using namespace std;
class Date
{
    //公有
public:
    Date(int year, int month=1 , int day = 1)
        :_year(year),
        _month(month),
        _day(day)
    {
    }
    //加上explicit关键字,禁止构造函数发生隐式转换
   /* explicit Date(int year, int month = 1, int day = 1)
        :_year(year),
        _month(month),
        _day(day)
    {
    }*/
    //私有
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    Date d1(2024,2);//构造函数
    Date d2 = { 2024,3 };//构造函数+拷贝构造+优化——>构造函数(发生了隐式类型转化)//c++11
    return 0;
}

总结:

1——对于单个参数或者除第一个参数无默认值其余参数有默认值的构造函数,具有类型转换(强制类型转换)的作用。
2——用explicit关键字修饰构造函数,将会禁止构造函数发生隐式转换。

二、Static成员(静态成员变量,静态成员函数)

static修饰的成员变量,不走初始化列表,需要在类外定义(声明和定义必须分离)
静态成员变量定义:

int Date::sum=0;

静态成员函数定义:

int Date::add()
{
//…………
}

需要记住:
static修饰类成员的特性:

1——静态成员为所有类对象所共享,不属于某个具体的类,存放在静态区。
2——静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明。
3——类静态成员可以用类名::静态成员或者对象.静态成员来访问。
4——静态成员函数没有隐藏的this指针,不能访问任何非静态成员。
5——静态成员也是类的成员,受public、protected、private访问限定符影响。
6——静态成员变量和静态成员函数本质上是受限制的全局变量和全局函数。(专属这个类,受类域和访问限定符的限制)

三、友元

友元分为友元函数和友元类。

3.1友元函数

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

问题:
尝试去重载operator<<,然后发现没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一 个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。
解决方案:
所以要将operator<<重载成全局函数。但又会导致类外没办法访问成员,此时就需要友元来解决。operator>>同理。

#include <iostream>
using namespace std;
class Date
{
    //声明友元函数
     friend ostream& operator<<(ostream& _count,Date& b);
    //公有
public:
    //初始化列表
    Date(int year,int month,int day)
        :_year(year),
        _month(month),
        _day(day)
    {}
    //私有
private:
    int _year;
    int _month;
    int _day;
};
ostream& operator<<(ostream& _count,Date& b)
{
   return  _count << b._year << "年" << b._month << "月" << b._day << "日";
}
int main()
{
    Date d(1970, 1, 1);
    cout << d ;
    return 0;
}

1——友元函数可访问类的私有和保护成员, 但不是类的成员函数
2——友元函数不能用const修饰
3——友元函数可以在类定义的任何地方声明,不受类访问限定符限制
4——一个函数可以是多个类的友元函数
5——友元函数的调用与普通函数的调用原理相同

3.2友元类

友元类的所有成员函数都可以是另一个类的友元函数, 都可以访问另一个类中的非公有成员。
1——友元关系是单向的,不具有交换性。
比如Time类和Date类,在Time类中声明Date类为其友元类, 那么可以在Date类中直访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
2——友元关系不能传递。
如果C是B的友元,B是A的友元, 则不能说明C时A的友元。
3——友元关系不能继承。

注意:

友元是一种突破封装的方式,会增加耦合度,不易多用。
高耦合:出了错误,全部都错。
低耦合:出了错误,个别程序还能跑。

四、内部类

概念:**如果一个类定义在另一个类的内部,这个内部类就叫做内部类。**内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何的访问权限。
注意:
内部类就是外部类的友元类,内部类可以通过外部类的对象参数来访|问外部类中的所有成员。但是外部类不是内部类的友元。

#include <iostream>
using namespace std;
class A
{
public:
    //内部类
    class B
    {
    public:
        void fun(const A& c)
        {
            cout << c.a << endl;
            cout << _a << endl;
            cout << b << endl;
        }
    private:
        int b = 3;
    };
private:
    int a=1;
    static int _a;
};
int A::_a = 2;
int main()
{
    A::B b;
    b.fun(A());//A()是匿名对象,生命周期只能在这一行
    return 0;
}

特性:
1.内部类可以定义在外部类的public、protected、 private都是可以的。
2.注意内部类可以直接访问外部类中的static成员,不需要外部类的对象或者类名。
3.sizeof(外部类)=外部类, 和内部类没有任何关系。

五、匿名对象

 A aa()//不能这样定义对象,编译器无法识别这是函数声明还是对象定义。
 //匿名对象生命周期只在这一行,下一行它就会自动调用析构函数,定义如下:
 A();
 A().Sum(1,2);

临时对象和匿名对象生命周期只有一行。

六、拷贝构造时的编译器优化

在传参和传返回值的过程中,编译器会做一些优化,减少对象的拷贝。
这些优化,不同的编译器可能结果不同。
隐式类型:连续构造+拷贝构造——>优化为直接构造

//先用1构造一个临时对象,在用临时对象拷贝构造aa,直接被优化成构造。
//不发生优化,拷贝一个临时变量,给它取别名。
const A& aa1=2;
A aa=1;

优化的前提——同一个步骤里。

优化的方式:

  1. 构造+构造——>构造
  2. 构造+拷贝构造——>构造
  3. 拷贝构造+拷贝构造——>拷贝构造
    例子:
    A f()
    {
    A aa;
    return aa;
    }
    A aa1=f();

七、在次理解类和对象

举个例子:
我们如何让计算机去描述洗衣机

1.用户先要对现实中洗衣机实体进行抽象——即在人为思想层面对洗衣机进行认识,洗衣机有什么属性,有那些功能,即对洗衣机进行抽象认知的一个过程。
2。经过1之后,在人的头脑中已经对洗衣机有了一个清醒的认识,只不过此时计算机还不清楚,想要让计算机识别人想象中的洗衣机,就需要人通过某种面向对象的语言(比如:C++、Java、Python等)将洗衣机用类来进行描述,并输入到计算机中。
3.经过2之后,在计算机中就有了一个洗衣机类,但是洗衣机类只是站在计算机的角度对洗衣机对象进行描述的,通过洗衣机类,可以实例化出一个个具体的洗衣机对象,此时计算机才能洗衣机是什么东西。
4.用户就可以借助计算机中洗衣机对象,来模拟现实中的洗衣机实体了。

学习类和对象,我们一定要体会到:类是对某一类实体(对象)来进行描述的, 描述该对象具有那些属性,那些方法,描述完成后就形成了一种新的自定义类型, 使用用该自定义类型就可以实例化具体的对象。

TC264摄像头循迹进阶:八邻域与逐行遍历在复杂赛道边界提取中的实战对比 本文对比分析了TC264摄像头循迹中八邻域法与逐行遍历法在复杂赛道边界提取中的实战表现。八邻域法在边界连续性方面表现优异,适合处理环岛等复杂元素;逐行遍历法则在计算效率和岔路口识别上更具优势。文章提供了详细的代码实现和优化策略,帮助智能车竞赛选手根据赛道特点选择最佳算法方案。 阅读详情

相关推荐

别再为镜面物体检测发愁了!手把手教你用PMD相位偏折术增强2.5D形状图细节(附Python代码)

本文详细解析了PMD相位偏折术在工业视觉中镜面物体检测的应用,通过2.5D成像方案增强形状图细节。文章提供了Python代码示例,介绍了一种计算高效的局部特征增强算法,帮助解决产线环境中的噪声问题,提升缺陷识别准确率。

weixin_29299807的博客 345

C++学习类和对象

2.内部类默认是外部类的友元类。3.内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。

2401_87151064的博客 1321

AI Agent Harness Engineering 监控与日志系统搭建

在生成式AI(Generative AI)与大语言模型(LLM)普及的今天,AI Agent(自主智能代理)已经成为了继「LLM API调用」「单轮/多轮对话」之后的第三代AI应用范式——Agent能够自主感知环境、制定多步决策、调用外部工具(Web搜索、数据库、RAG检索、企业系统API等)、执行复杂任务并优化自身策略。然而,随着Agent应用从Demo原型快速落地到企业生产环境,一系列与工程化落地强绑定的可观测性(Observability)问题正在成为Agent项目成功上线、稳定运行的最大瓶颈。

AI开发架构师 183

【C++】深入学习类和对象

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字。内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访 问外部类中的所有成员。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

lyhv_v的博客 782

基于FaceX-Zoo实现的Face Mask Adding人脸戴口罩

人脸系列文章目录 文章目录人脸系列文章目录前言一、加口罩效果二、实现原理二、代码实现 前言 目前人脸加口罩均为在人脸位置贴图式的,非常不真实。前段时间京东开源一个基于PRnet实现的3D口罩拟合人脸,加口罩非常逼真,但是只是单独一个加口罩demo,没有完整的流程。于是本人结合人脸检测,关键点对齐。PRnet加口罩实现一个完整的加口罩流程。只需一个命令简单方便调用,实现人脸加口罩。 https://github.com/JDAI-CV/FaceX-Zoo 一、加口罩效果 下图可以看出效果还是非常逼真的

zengwb的博客 3390

Win上通过Jconsole查看Java程序资源占用情况(教程总结,一篇就够了)

JConsole 是一个内置 Java 性能分析器,Java 5开始 引入了 JConsole。可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole来监控 Java 应用程序性能和跟踪 Java 中的代码。Jconsole工具查看程序的资源占用请求。安装jdk时bin目录有jconsole.exe工具,或者通过 Win + R,输入jconsole.exe启动jconsole( 可以从命令行直接输入jconsole。

明生的博客 6239

【C++指南】一文总结C++类和对象【上】

一文总结C++类和对象【上】

egoist2023的博客 2247

十一、机器学习进阶知识:径向基神经网络(RBFNN)的实现(Python,附源码及数据集)

本文对径向基神经网络(RBFNN)的理论基础及建模步骤进行介绍,之后使用Python实现基于RBFNN的数据预测,通俗易懂,适合新手学习,附源码及实验数据集。

weixin_42051846的博客 1万+

C++学习类和对象三

1.const成员函数将成员函数后加const,成员函数的this指针由 date*const this变为const date*const this。

2401_87151064的博客 423

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5710

cesium 综合教程200+【目录】(已包含186篇文章)

cesium示例教程100+旨在为开发者提供简单快捷的,。在每一个示例中,解释相应的API知识点,做到。目录中有链接的为已有文章,没链接的为目标文章,不断更新中…

大剑师兰特的GIS世界 8889

C++学习类与对象

分析出解决问题的步骤,再用函数将这些步骤一一实现,使用的时候依次调用,面向过程的核心是过程。优点性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。缺点缺点不易维护、不易复用、不易扩展。.........

qq_45698138的博客 886

AI Agent Harness实时监控大屏搭建实战

本文将以目前主流的AI Agent管控框架Harness为基础,结合React、ECharts、WebSocket技术,手把手带你搭建一套完整的实时监控大屏,覆盖全局概览、状态分布、工具调用统计、异常告警、实时日志等核心功能,不需要复杂的底层开发,复制代码就能快速跑通。本文我们从需求出发,先梳理了AI Agent的核心监控指标,然后搭建了监控大屏的静态布局,逐个实现了各个图表,对接了Harness的实时数据源,最后加了交互和告警功能,完整走了一遍监控大屏从设计到落地的全流程。

大数据洞察的博客 170

c++ 类 (要学习类这一篇就够了 )

用 9159 个字详细讲解c++的类。值得一看。

2301_80772499的博客 8526

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【 C++入门基础】---- 学习类与对象前的一些准备工作

• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。//wsj是我随意为变量空间取的名字//命名空间中可以定义变量/函数/类型int rand;int* a;int top;• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不再冲突了。int rand;//不再报错int* a;int top;

Wangshijie1015的博客 946

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++类和对象(下)

Hello,大家好,今天,我们来继续学习类和对象部分的知识。

2301_81390458的博客 1369

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++练习:类和对象

C++ 是一种高级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。 C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性: 封装 抽象 继承 多态 1. 如何用 VS Code 写C++ 准备工作: 安装 VS Code 以及在其软件的应用商店

Naiva的博客 1119

C++的类和对象(下)

无论是否显示写初始化列表,每个构造函数都哟初始化列表;无论是否在初始化列表中初始化·,每个成员变量都要走初始化列表;class Datepublic:,_day(day),_t(12),_ref(x),_n(1)// error C2512: “Time”: 没有合适的默认构造函数可⽤// error C2530 : “Date::_ref” : 必须初始化引⽤。

2302_79964175的博客 1558

C++初阶-类和对象(上)

本章内容相对于之后的类和对象中和下都比较简单,但是整体还是有些难度的。1.类的定义1.1类定义格式(1)class为定义类的关键字,类的定义的格式为:class name{main};其中name是类的名字,main包含了类的主体内容。其次类定义结束时有个";"不能省略,和之前的结构体一样。类体中的内容称为类的成员;类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类可以存储变量和函数,这比C语言学过的结构体又增加了一个存储的类型。可以说C++中的类替换了C语言的结构体的作用。

博客是在C++/Java/Liunx/算法的学习阶段所写的博客,内容可能不是很全面 1363

C++类和对象(中)

Hello,大家好,今天,我们来继续学习类和对象部分的知识。

2301_81390458的博客 1952

C++初阶类与对象(一):学习类与对象、访问限定符、封装、this指针

1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 3.1类的结构 3.2类的两种定义方式 3.21声明和定义全部放在类体中 3.2.2声明和定义分开 3.3成员变量命名规则的建议 4.类的访问限定符及封装 4.1访问限定符 4.2封装 5.类的作用域 6.类的实例化 7.类对象模型 7.1类对象的存储方式 7.2结构体内存对齐规则 8.this指针 8.1this指针的引出 8.2 this指针的特性 8.3经典问题

qq_74415153的博客 1345
上一篇: 数据结构——堆的实现
下一篇: [C/C++]——内存管理
一个小脑袋
一个小脑袋 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄6年 4388粉丝 79原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值