7 c++ 类

C++Primer第7章 类 数据抽象能帮助我们将对象的具体实现与对象所能执行的操作分离开来。 类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程(以及设计)技术。类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、赋值接口实现的函数体以及定义类所需的各种私有函数。 封装实现了类的接口和实现的分离。类要想实现数据的抽象和封装,首先要定义一个抽象数据类型。 7.1 定义抽象数据类型 一个抽象数据类型,我们可以通过它的接口使用它的对象,不可以直接访问它的数据成员。 定义在类内部的函数是隐式的inline函数。 阅读详情

基本类的定义

类可以使用struct或class标识
struct:默认成员访问权限为public
class:默认成员访问权限为private
类一般使用头文件和源文件分离分离的方式,如下示例类的一般定义
SalesData.h文件

#include <string>
#include <vector>

#ifndef SalesData_H
#define SalesData_H
// SalesData声明
struct SalesData{
    // 友元函数声明,不属于类的成员,但可以访问类实例的私有成员
    friend SalesData add(const SalesData &, const SalesData &);

    public:
        SalesData() = default;
        // 有参构造函数,_money(money)为为属性_money赋值
        SalesData(const int money) : _money(money){ };

        int GetMoney() { return _money; }
        
        SalesData combine(const SalesData &);

        // 常量成员函数
        int Sum(std::vector<SalesData>) const;

    private:
        int _money;
};

// 函数声明
SalesData add(const SalesData &, const SalesData &);
#endif

SalesData.cpp文件

#include "SalesData.h"
#include <vector>

SalesData SalesData::combine(const SalesData & data){
    return SalesData(this->_money + data._money);
}

int SalesData::Sum(std::vector<SalesData> datas) const{
    int sum = 0;

    for(auto data : datas){
        sum = sum + data._money;
    }

    return sum;
}

SalesData add(const SalesData & left, const SalesData & right)
{
    return SalesData(left._money + right._money);
}

友元类与友元类成员函数

class Screen
{
    // 声明友元类,WindowMgr可以访问Screen的私有成员
    friend class WindowMgr;

    // 声明友元函数,WindowMgr::Clear可以访问Screen的私有成员
    friend void WindowMgr::Clear();

public:
    
private:
    
};

类内定义数据类型别名

class Screen
{
public:
    // 为 size_type 定义别名,该别名为 public 访问权限,外部可以使用该别名
    typedef std::string::size_type pos;

    pos GetCursor();

private:
};

构造函数

class Screen
{
public:
    // 默认构造函数
    Screen() = default;
    // 委托构造函数,这个构造函数会调用下面的构造函数
    Screen(pos height, pos width): Screen(height, width, ' '){ };
    // index提供默认值0,:后面为初始化属性列表
    Screen(pos height, pos width, char c, int index = 0) : Height(height),
                                            Width(width),
                                            Contents(height * width, c),
                                            index(index),    // 常量数据成员必须赋予默认值或在初始化列表中初始化
                                            index1(index)    // 引用数据成员必须赋予默认值或在初始化列表中初始化
    {
    };

    // 常量数据成员
    const int index = 1;
    // 引用数据成员
    int &index1;

private:
};

隐式内联函数,const函数

// 隐式内联函数(在类声明中定义函数)
// const成员函数(设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const)
char Get() const { return Contents[Cursor]; }

*this返回当前对象的引用

// 返回当前对象(this存放的时当前对象指针)
Screen &Set(pos line, pos col, char c)
{
    Contents[line * Width + col] = c;
    return *this;
}

const函数与this

const函数使用的this是const *类型

// 由于 GetConstThis 是常量,所以 GetConstThis 使用的this是const *类型
Screen const &GetConstThis() const { return *this; }

类不能包含自身类

// 错误:类不能包含自身,对象的空间是根据类型分配的,如果类包含自身则无法计算类的空间
// Screen ChildScreen;

// 正确:ChildScreen的类型是指针,空间大小固定
Screen *ChildScreen;

静态成员

    // 静态成员函数,外部使用 Screen::GetIntanceNum() 访问
	static int GetIntanceNum();
    // 静态成员变量,静态成员变量必须在类外定义并赋值
	static int abc; 



	// 类外部定义定义静态成员变量
	int Screen::abc = 0;

常量类对象

const SalesData colorPan(30);   // 声明colorPan为常量(colorPan在生成之后不会改变)
// colorPan.GetMoney();         // 错误,这里GetMoney并非常量函数,常量对象只能调用常量函数(如果可以调用非常量函数,这意味着GetMoney可以改变colorPan的数据成员)

默认构造函数生成对象

// 下面的定义是错误的
// 下面的语句被解读成,声明colorPan1,colorPan1是函数,函数返回SalesData
// SalesData colorPan1();
// colorPan1.GetMoney();

// 下面的定义是正确的,使用默认构造函数
SalesData colorPan1;

类类型隐式转换和显示转换

// 类类型隐式转换
// combine接受的是一个SalesData类型,但SalesData类型有一个接受int的构造函数
// 下面的语句等价于 book.combine(SalesData(10));
// 通过在构造函数前加 explicit 可以阻止这种行为 如: explicit SalesData(const int money) : _money(money){ };
book.combine(10);

// 类的显示转换
book.combine(static_cast<SalesData>(10));

constexpr对象

    // constexpr对象,这里使用默认构造函数生成对象,这样constexprClass的默认构造函数必须是constexpr
    constexpr ConstexprClass constexprClass;
    // constexprClass.field = 1;        // 错误constexpr对象不能进行修改

	class ConstexprClass
	{
	private:
	    /* data */
	public:
	    // constexpr构造函数,必须初始化所有数据成员
	    constexpr ConstexprClass(/* args */): field(1){};
	
	    int field;
	};
数据仓库的复用性:设计和构建一个高复用性的数仓 数据仓库的复用性是指在数据仓库的设计和使用过程中,能够实现数据、模型、流程、工具等多个层面的重复利用,减少重复开发,提高开发效率,降低维护成本,并增强灵活性和可扩展性。 阅读详情

相关推荐

ConnectionResetError 10054 根因分析与全链路防御指南

ConnectionResetError(错误码10054)是TCP协议中服务端主动发送RST包导致的强制断连,本质并非网络连接失败,而是服务端基于空闲超时、连接满载、TLS协商失败等策略做出的确定性终止决策。理解其底层原理有助于跳出‘重试’误区,转向连接生命周期管理。该错误高频出现在HTTP长连接、WebSocket、第三方API对接等场景,尤其在Nginx反向代理、负载均衡器(如AWS ALB)、WAF设备及内核conntrack机制下极易触发。本文结合Wireshark抓包分析、客户端心跳保鲜、协议指

weixin_30225755的博客 639

PTA 7-3 学生CPP成绩计算 (15分) c++ 第5章类继承

题目 给出下面的人员基类框架: class Person { protected: string name; int age; public: Person(); Person (string p_name, int p_age); void display () {cout<<name<<“:”<<age<<endl;} }; 建立一个派...

qq_40468936的博客 2664

【TC3xx芯片】TC3xx芯片电源管理系统PMS详解

本文主要介绍了TC3xx芯片的电源管理系统(PMS),重点探讨了供电模式选择、电源监控机制及电源管理模式。文章首先分析了4种供电模式及其硬件配置方式,详细说明了3.3V单电源供电模式的特点;其次阐述了Primary和Secondary两种电源监控机制,包括阈值配置和异常中断处理;最后重点讲解了CPU和系统的电源管理模式,特别对Standby模式及其进入/退出条件进行了详细说明。文章以软件开发视角解析了TC3xx芯片的电源管理功能,为ECU低功耗设计提供了技术参考。

redparrot2008的博客 1531

7.【CPP】String类

我们知道计算机存储英文字母,标点,数字用的是ascall码,128种用一个字节表示绰绰有余。而汉字远远不止128种,因此。> UTF规定:如果一个符号只占一个字节,那么这个8位字节的第一位就为0。如果为两个字节,那么规定第一个字节的前两位都为1,然后第一个字节的第三位为0,第二个字节的前两位为10,然后如果是三个字节的话,那么第一个字节的前三位为111,第四位为0,剩余的两个字节的前两位都为10。

m0_73865858的博客 1398

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 496

用PyTorch实战清华SSVEP数据集:手把手教你搭建第一个脑机接口分类模型(附完整代码)

本文详细介绍了如何使用PyTorch实战清华大学SSVEP数据集,从数据预处理到CNN模型构建的全流程。通过手把手教学,帮助读者搭建第一个脑机接口分类模型,特别针对数据维度转换等关键难点提供可视化解析,并附完整代码实现。

weixin_42566121的博客 352

【亲测免费】 推荐开源项目:7zip-cpp - 简易操作7-Zip压缩库的C++接口

7zip-cpp是一个现代化的C++库,它为7-Zip的COM类API提供了一个简单的封装,使开发者能够轻松地在自己的项目中实现文件压缩和解压缩功能。这个项目源自SevenZip++,并经过更新以支持最新的LZMA1801 SDK,并采用现代构建系统CMake进行管理。 ## 2、项目技术分析 7zip-cpp的核心是通过CMake来生成适用于不同Visual Studio版本的构建文件,使得...

gitblog_00064的博客 1101

Abaqus 单元与全局刚度矩阵导出实战指南:从INP修改到结果解析

本文提供了Abaqus中导出单元刚度矩阵和全局刚度矩阵的完整实战指南。通过详细步骤讲解INP文件修改、关键指令插入及结果文件解析,帮助工程师、研究人员和二次开发者深入理解有限元软件内核,实现理论验证、二次开发与深度问题调试。

k8s6orchestrator的博客 899

《C++ Primer》第7章:类

《C++ Primer》第7章:类

zhangyang249的博客 349

大模型备案避坑指南:如何设计符合TC260标准的评估测试题集?

本文深入探讨了如何设计符合TC260标准的大模型评估测试题集,以顺利通过备案。文章从解构标准核心逻辑出发,详细阐述了题集设计的工程化流程、核心原则与常见误区,并提供了模拟真实对抗的高阶测试策略与度量分析方法,旨在帮助企业构建一套能真实反映模型安全水位、有效规避风险的评估体系。

kafka6courier的博客 663

浅析MOS管导通过程及RC吸收电路设计要点

RC吸收电路 米勒电容 MOS导通过程

liangbo1999的博客 2万+

《C++ Primer》习题参考答案:第7章 - 对象和类

第七章 类 练习7.1 使用2.6.1节定义的Sales_data类为1.6节的交易处理程序编写一个新版本。 解: #include <iostream> #include <string> using std::cin; using std::cout; using std::endl; using std::string; struct Sales_data { ...

种树最好的时间是10年前,其次是现在!!! 6471

vivo X200 Ultra前瞻系列(1):重塑影像旗舰标准

在色彩风格化、视频专业度上实现了安卓阵营的突破性进步。其2亿像素长焦、双LYT-818传感器及5轴防抖技术,对追求个性化创作的用户具有强吸引力。若真机表现能兑现硬件承诺,X200 Ultra有望重新定义手机影像的“专业”标准。然而,其厚重设计、价格门槛及生态适配问题,仍需市场检验。vivo X200 Ultra作为2025年上半年影像旗舰,以“全焦段夜视仪+电影级视频”为核心卖点,主打。,对标小米15 Ultra、OPPO Find X8 Ultra等竞品。,顶配版(24GB+2TB)逼近万元。

专注:太空算力、AI infra、异构调度、大模型成本工程 964

C++ primer 第7章 类 思维导图

776

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++Primer第五版 第7章 类 7.3类的其他特性 练习

C++Primer第五版 第7章 类 7.3类的其他特性 练习

Fern_v的博客 218

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【C++】【C++ Primer】7-类

【C++】【C++ Primer】7-类1 定义抽象数据类型 类的基本思想是数据抽象和封装。 数据抽象是一种依赖于接口和实现分离的编程技术。类的接口包括用户所能执行的操作。类的实现则包括类的数据成员、接口的具体实现、定义类所需的各种私有函数。 封装实现了类的接口和实现的分离。封装后的类隐藏了实现细节,类的用户只能使用接口,无法访问实现部分。 类想要实现数据抽象和封装,首先要定义一个抽象数据类型。在抽象数据类型中,类的设计者考虑类的实现过程,使用该类的程序员只需要抽象思考类型做了什么,无需了解类型的工作细节。

慕容陌尘的博客 566

OV9734 DATASHEET,完整规格书

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

7. C++中类的封装

类通常分为以下两个部分 1. 类的实现细节 2. 类的使用方式 注:当使用类时,不需要关心其实现细节;当创建一个类时,才需要考虑其内部实现细节; 使用手机时,只需要知道如何发短信,打电话,拍照等等即可,不需要关心手机是如何开发出来的。手机开发工程师就需要考虑手机内部的实现细节,如硬件细节和软件细节。 一、封装的基本概念 ...

zhubao124的博客 2188

7.C++中的类

文章目录*C++中的类**7.1定义抽象数据类型**7.1.2定义改进的`Sales_data`类**定义成员函数**引入`this`**引入`const`成员函数**类作用域和成员函数**在类的外部定义成员函数**定义一个返回`this`对象的函数**7.1.3定义类相关的非成员函数**定义`read`和`print`函数**定义`add`函数**7.1.4构造函数**合成的默认构造函数**某些类不能依赖于合成的默认构造函数**定义`Sales_data`的构造函数**`= default`的含义**构造

EdSheeran的博客 2021

C++ //练习 7.23 编写你自己的Screen类。

【代码】C++ //练习 7.23 编写你自己的Screen类。

Made in Code 312

《C++ Primer》第7章 类

7.1 定义抽象数据类型 引入this 成员函数通过一个名为this的额外隐式参数来访问调用它的那个对象。当我们调用一个成员函数时,用请求该函数的对象地址初始化this。例如,调用 total.isbn(); 则编译器负责把total的地址传给isbn的隐式形参this,可以等价的认为编译器将该调用重写成了如下的形式: Sales data::isbn(&total) 其中,调用Sa...

weixin_43784305的博客 385

C++ //练习 7.22 修改你的Person类使其隐藏实现的细节。

【代码】C++ //练习 7.22 修改你的Person类使其隐藏实现的细节。

Made in Code 245

C++Primer学习——第7章 类

文章目录类定义改进的Sales_data类const成员函数类作用域和成员函数在类的外部定义成员函数定义一个返回this对象的函数定义类相关的非成员函数构造函数合成默认构造函数某些类不能依赖于合成的默认构造函数定义Sales_data 的构造函数=default的含义构造函数初始值列表在类的外部定义构造函数拷贝、赋值和析构某些类不能依赖于合成的版本访问控制与封装struct和class关键字友元封装的益处友元的声明类成员定义一个类型成员Screen类的成员函数令成员作为内联函数可变数据成员类数据成员的初始值

m0_47598872的博客 917

第7章 类【C++】

类的基本思想是数据抽象和封装,数据抽象是一种依赖于接口和实现分离的编程技术。封装实现了类的接口和实现额分离,封装后的类隐藏了它的实现细节。 类要想实现数据抽象和封装,需要首先定义一个抽象数据类型。C语言中没有类的概念,但是有struct结构体供我们定义抽象的数据类型,但是本身不支持封装、以及类方法。 如果结构体大小是定长时,结构体的实例内部内存是连续的,那么则会有许多的用途,比如串口协议等。 方法、this this的数据类型就是,Person*,他是一个相应类数据类型的常量指针我们发现刚刚的成员函数的代

高万禄的博客 363

C++ Primer 第七章 7.3 类的其他特性 练习和总结

7.3 类的其他特性 7.3.1类成员再探 在类中,我们也可以使用为数据类型启类型别名。 class Screen{ public: using pos = string::size_type; private: pos width=0,height=0;//类内初始值初始化 pos cursor {0};//初始化列表初始化 string contents; }; 至于为什么这个类...

大琪子的博客 332

C++入门7——string类的使用

详细介绍string的用法!string中size、capacity、length、append、reserve、resize、clear、empty、append、insert、erase、replace、swap、find、substr等的使用指南

weixin_73629886的博客 1272

C++ primer 第7章 类

成员函数的声明必须在类的内部,定义则既可以在类的内部,也可以在类的外部。 作为接口组成部分的非成员函数,它们的定义和声明都在类的外部。 类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或函数成为它的友元。如果类想把一个函数作为它的友元,只需要增加一条以friend关键字开始的函数声明语句即可。 友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限。友元不是类的成员,不受所在区域访...

weixin_43116900的博客 211
上一篇: 6 c++ 函数
下一篇: 8 c++ 流
dabusidede
博客等级 码龄9年 84粉丝 208原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值