【C++--类和对象】开篇

news2024/12/24 16:16:19

内联

在频繁调用一个函数时,会建立栈帧,如何减少内存的消耗

int add(int x,int y)

{ return (x+y)*10; }

c语言中,用宏函数 #define add(x,y) (((x)+(y))*10)

若不加括号会出现一些问题

宏优势 不需要建立栈帧,提高调用效率,可复用和修改

缺点 易出错 复杂 可读性差 不能调试

由于宏太容易出错了,于是有了内联函数 inline

内联函数 不需要建立栈帧 不复杂 不容易出错 可以调试 适用于短小的 频繁调用的函数 太长了容易代码膨胀 会让安装包变大

inline对于编译器仅仅只是一个建议,是否变为内联由编译器自己决定

不会变成内联的情况:

1.较长的函数 2.递归函数

eg:Func(); 如果代码中有1000个位置调用Func(),那么

默认debug版本下inline不会起作用,否则无法调试 而release不方便汇编

需要调一下编译器 在设置里边 常规-调试信息格式-程序数据库

c/c++ 优化-内联函数扩展-只适用于inline

让它不是内联 多输出一些cout

内联声明和定义不分离

nullptr 优化

10c1a45a0b3140358381f049656dbbd7.png

用空指针就用nullptr 语言建立的原则是向前兼容

C语言是面向过程的,C++是面向结果的,C++更关注对象与对象之间的关系和交互

C++兼容C语言,struct之前的用法都可以用, 类也升级成为了类。并且在struct类里边可以写成员函数

struct类也可以用访问限定符

struct不写访问限定符默认是公有,class默认是私有(唯一区别)

封装

214d3ba03f724883905c1d3ed8646667.png

 

面向过程 C语言 关注过程步骤 面向对象 C++ 关注点是对象与对象之间的关系和交互,将现实世界中的类和对象映射到虚拟计算机系统中

本质是为了更好地管理,让用户方便使用类

类里面定义的函数默认是内联(inline),所以一般函数体中内容较短的直接在类内定义,较长的就在类外定义。

class Data
{
public:
    void Init(int year)
    {//局部域
        year=year;
        //这句代码表示的是将局部域的year赋值给类域的year,
        //等号右边表示局部域的year,左边表示类域的year
        //遵循局部优先原则
        //域:类域  局部域 全局域 命名空间域
默认访问顺序:局部域-->全局域-->展开了的命名空间域or指定访问命名空间域
    }    
private:
    int year;//类域
    int month;
    int day;
};

声明和定义的真正区别在于开不开空间 声明类似于图纸,只有实例化之后才能才能赋值(存放数据),类型可以实例化出很多对象

计算类的大小

只算成员变量的大小(需要类型对齐),不算成员函数,成员函数相当于小区里边的篮球场,建在小区里边,属于公共区域。成员函数如果每个对象里头都有的话会造成很大的浪费。成员函数在公共代码区域里边存储,编译的时候去公共区域找寻,而不是到对象里边找。

//计算大小
class A
{
public:
    void Print()//成员函数不计算在大小里面
    {
            
    }
private:
    char _a;//大小是1
    ...
};
int main()
{
    A aa;
    sizeof(A);//sizeof(类)
    sizeof(aa);//sizeof(对象名)
    //这两种方式都是可行的
    //相当于直接通过图纸来计算房子面积/拿尺子来计算房子面积
    
    return 0;
}

空类的大小是1,一字节是为了占位。如果是0,没有地址

ps:结构体对齐

为什么要进行内存对齐?

硬盘决定一次读取多少位(可能是4位),如果不进行内存对齐可能存在一个数据要读取多次

this指针

是一个const类型的指针,不能在形参和实参中显式传递,但是函数内部可以使用。

eg:Data* const this

//在* 之后修饰this本身,this不能改,但this指向内容可以改

:: 域作用访问限定符 前边可以是类域/命名空间域

this指针是形参 实参传给形参得建立栈帧,跟普通函数一样得进行压栈,存在栈区里边

b2fc476602284f368d59d3c0e1cb070d.png

 

 

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

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

相关文章

【文末送书】2023年以就业为目的学习Java还有必要吗?

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

软件测试7大误区

随着软件测试对提高软件质量重要性的不断提高,软件测试也不断受到重视。但是,国内软件测试过程的不规范,重视开发和轻视测试的现象依旧存在。因此,对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&#xf…

外卖配送系统开发指南:打造高效、智能的外卖服务

随着外卖市场的蓬勃发展,餐厅和外卖平台需要不断提高外卖服务的效率和智能性,以满足不断增长的需求。在本文中,我们将探讨如何开发一个高效、智能的外卖配送系统,同时提供一些关键代码示例来帮助您入门。 环境准备 在开始外卖配…

驱动开发 day3

总结:自动创建设备节点udev的流程 1.如何创建节点 手动创建:mknod 地址 设备文件类型 主设备号 次设备号(0 - 255) 自动创建:devfs (创建节点的逻辑在内核 ---> 2.4版本以前使用) udev (创建节点的逻辑在应用层) mdev (轻量级的udev) 2.…

图论第一天|深度优先搜索理论基础、广度优先搜索理论基础、797.所有可能的路径

深度优先搜索理论基础 文档讲解 : 代码随想录 - 深度优先搜索理论基础Hello 算法 9.3 图的遍历 状态:开始学习。 dfs(深度优先搜索)与bfs(广度优先搜索)区别 dfs是可一个方向去搜,不到黄河不回…

视频监控/安防监控/AI视频分析/边缘计算EasyCVR平台如何调取登录接口获取token?

安防视频监控管理平台/视频汇聚/视频云存储平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、云存储、AI智能分析等,视频监控智能分析平台EasyCVR融合性强、…

(JavaEE)线程的状态

前言:进程的状态,最核心的就是 就绪状态 和 阻塞状态,这对于线程同样适用,在Java中,又赋予了线程一些其他的状态。 线程的所有状态 NEW : Thread对象已经有了,但是start 方法还没调用。TERMINATED : Thre…

uniapp H5生成画布,插入网络图片。下载画布

因为网络图片不能直接使用ctx.drawImage()插入。得使用uni.getImageInfo()方法下载后插入。 但是当画布中存在多张网络图片时,必须等待uni.getImageInfo()下载完成后才行。这样得下载套下载。太过于繁琐。所以定义了一个递归下载方法。同时避免下载图片异…

【数据结构】长篇详解堆,堆的向上/向下调整算法,堆排序及TopK问题

文章目录 堆的概念性质图解 向上调整算法算法分析代码整体实现 向下调整算法算法分析整体代码实现 堆的接口实现初始化堆销毁堆插入元素删除元素打印元素判断是否为空取首元素实现堆 堆排序创建堆调整堆整合步骤 TopK问题 堆的概念 堆就是将一组数据所有元素按完全二叉树的顺序…

四川玖璨电子商务有限公司:新媒体视频运营

新媒体视频运营是随着互联网技术的发展而兴起的一种新型媒体运营方式。它通过制作、发布和推广优质视频内容,以吸引受众眼球,提升品牌知名度和影响力。四川玖璨电商小编在此次新媒体视频运营实验中,我们对新媒体视频运营的关键要素进行了探索…

大数据精准营销适合什么行业,面临哪些问题?

大数据营销适合的行业还是非常多的,毕竟现在大部分的企业都是通过网络方式来获得客户的,只要同领域有网站,而且他们存在竞价或者是优化,或者是使用了相关的软件,这种情况下都是完全可以运用的。比较常见的行业有金融行…

高端知识竞赛中选手台桌设计方案和配套软件

高端知识竞赛选手台桌用于知识竞赛现场选手台,集成了知识竞赛软硬件设备,包括台前计分一体机或LED屏、抢答按钮等,和天纵竞赛软件配合使用,实现高端竞赛的计分需要。 知识竞赛选手台桌前计分屏可以显示丰富的内容,包括…

(JavaEE)多线程带来的的风险-线程安全 (第一部)

前言:线程安全是整个多线程中,最为复杂的部分,也是最重要的部分。 目录 什么是线程安全问题? 线程不安全的原因 ⁜⁜总结 :线程安全问题的原因 ⁜⁜ 解决方法1 ——加锁 synchronized (监视器锁monitor…

客户画像的作用是什么?

1、深度挖掘 客户画像包括客户的基本信息和个人行为数据,这些都可以作为企业成员和客户沟通的基础,且在此基础上可以更好地共情并深度挖掘客户真正想要什么。 2、分层精细运营 根据客户画像能充分了解客户的需求,再结合产品属性和企业文化…

【memmove函数的功能介绍及模拟实现】

memmove函数的功能介绍及模拟实现✍️ 1.memmove函数的功能介绍🧐 1.1函数结构🕵️ void * memmove ( void * destination, const void * source, size_t num );1.2 功能介绍🤯 根据cplusplus网站上对memmove函数的介绍: 它的…

全栈测试平台RunnerGo你了解嘛

在当今这个数字化时代,应用程序的性能至关重要。一款可靠的性能测试工具,能够为企业带来无数的好处。最近,一款名为RunnerGo的开源性能测试工具备受瞩目。本文将详细介绍RunnerGo的特点、优势以及如何解决性能测试中的痛点。 RunnerGo产品介绍…

02-Redis持久化

上一篇:01-Redis核心数据结构与高性能原理 1.RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”…

MemJam: A false Dependency attack against constant-time crypto implementations【存储缓存】

作者:A. Moghimi, J. Wichelmann, T. Eisenbarth, and B. Sunar. 发布:International Journal of Parallel Programming 时间:Aug 2019. 笔记: 缓存定时攻击 1、攻击原理 共享缓存存在定时侧信道的风险(例如在处理…

C++信息学奥赛1168:大整数加法

#include <iostream> #include <string> #include <cstring> using namespace std;char ArrString[205], BrrString[205];// 自定义的取最大值函数 int max(int a, int b){if(a > b){return a;}else{return b;} }int main(){int len 0;cin >> ArrS…

C++11 新特性 ⑤ | 仿函数与 lambda 表达式

目录 1、引言 2、仿函数 3、lambda表达式 3.1、lambda表达式的一般形式 3.2、返回类型说明 3.3、捕获列表的规则 3.4、可以捕获哪些变量 3.5、lambda表达式给编程带来的便利 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…