<文章原创,转载请说明出处,联系信箱623730587@qq.com>
一、开题
1 如果你一个人站在马路旁边看人来人往,突然有一个女孩子跑过来对你说”哇,这么冷得天,那个人穿短裤,好
搞笑啊!“,这意味着什么?
2 昨天理了个帅气的发型,去街上逛,于是就发生了上面一幕(得意一下),我想了老半天问“你是不是想泡我?”
结果...
3 好了,结果留给大家去想象,开始今天的内容。
二、c++中结构体或者类的大小(小小小知识点)
1 有如下结构体
struct Date
{
int year;
int month;
int day;
void show()
{
cout << year << '-' << month << '-' << day << endl;
}
}
2 这个结构体的大小为12个字节,毫无疑问,但是我要提出一个问题,结构体的show()函数难道不占用空间大小
吗?
3 好吧,我不卖关子了,这是因为,变量是存放在栈或者堆里面的,而函数是存放在代码区里面的,表面上看,
它们存放在同一个结构体中,但是本质上和c语言的结构体没什么区别,函数存放在代码区,变量存放在堆或
栈里面,只是c++的设计者将它们的身体放在了一起而已,身在曹营心在汉啊!这就是传说中的、大名鼎鼎的
封装,没有那么邪乎吧!
4 现在大家明白了为什么上面的结构体大小为12了吧。
三、char数组地址的输出(小小小知识点)
1 有如下的两个数组,其中第二个数组是存放在和data一样的栈空间中,而且地址相同,这是新的语法规定哦,
表示将堆内存分配到栈内存中去,由于栈是自动回收的,这样就不用自己delete了,这个好吧?
char data[100];
int * pch = new (data)int[25];
2 现在我们要输出data的地址
cout << data << endl;
3 上面的输出语句是一句乱码,为什么呢?数组名不是代表首地址吗?这是因为编译器会将char数组和char*理解
为字符出串,哦,终于明白了,原来上面的输出语句输出的是一个字符串啊,没有赋值当然是乱码,那怎么办?
cout << &data << endl;
这样就行了。如果是int类型数组的话,编译器就不可能认为是字符串了。
四、引用
1 引用就是变量的别名。就像我大名叫卓别林,小名叫狗蛋,其实是一个人。
2 用法:
1) 有如下变量
int a = 100;
上述语句执行意味着,操作系统要在内存中分配4个字节的区域,并给这块区域起名为a;一个区域有多个
名字是很正常的需求,所以就出现了引用的概念,到后面大家就会知道引用有大用了哦。
2) 引用的定义
int& pa = a;
这就表示给变量a取了一个别名pa。需要注意的是,定义引用的时候必须给引用赋值,下面语句不行。
int& pa; // error
3) 引用一旦初始化,那么被绑定的变量就服务终身。
int& pa = a;
int& pa = b; // error
ra = b; //right,这一句代码仅仅是将变量b的值赋值给ra。
4)绝对不能返回局部变量的引用,因为一旦函数调用结束,局部变量本身就消失了,所以引用就是无效的。
可以返回全局变量的应用,静态变量的应用,堆内存变量的引用,和引用类型的引用。
3 应用:
1) 函数的传参
我们都知道,如果以值方式传参,那么传递的将是实参的一个副本,也就是将变量复制了一份传给函数。
假如我们要交换两个变量的值:
void swap(int x,int y); // 值传递,要进行变量的复制,如果类型为struct类型,那么就会造成大规模
的复制,另外变量的值不会发生交换
void swap(int* x,int* y); // 指针的方式传递,变量的值发生交换,变量不会发生复制,但地址要复制,
不管传递的是基本类型还是复合类型,都只复制4个字节的地址值。
void swap(int& x,int& y); // 如果以引用的方式传参,那么传递进函数的将会是变量本身,变量不复制
2)函数的返回值
c语言中,函数的返回值一般作为右值,函数返回值一般是只读的,如果想让函数的返回值做左值,那么
就得用指针或者引用。
4 常引用
int& ra = 100; // error,因为引用只能和变量绑定,而不能和常量绑定。
const int& ra = 100; // right
c语言中,函数传递参数是加const的作用是,防止变量的值被修改
void fun(const int x); // 防止值被修改
而c++中,函数传递参数时,加const的作用有两个,防止变量的值被修改,和增强函数的兼容性。
void fun(const int& x); //这样就既可以传递变量,也可以传递常量,增强了兼容性,也防止值被修改
5 引用的底层实现
1)const int* pa; / int const * pa;
上述语句代表的是不能通过指针pa修改内存中的值。但是可以改变指针所指向的地址,这是c语言中的基
本的知识点。
int a = 20;
const int *pa = &a;
*pa = 30; // error,不能通过pa修改它所指向的内存中的值
int b = 40;
pa = &b; // right,指针本身的地址可以改变
int *const pra = &a; // 注意,const的位置在*之后,和上面的语句对比就可以发现不同。这表明不能修改
指针的指向,也就是说pra指针和a的地址绑定,但是可以通过pra修改它所指向的内存中的值。
2)引用则是变量的值可以改变,而变量的地址不可以改变(终生绑定的特性)。说到这里有没有发现,原来
引用的作用和const int* pa的作用是刚好相反的。其实引用本质就是上面的第二种写法int *const pra的定
义。
6 注意引用本身不占用内存大小。
7 思考,引用和指针的联系和区别???
六、c++中的类型转换(四个转换运算符)
1 首先说明c语言中的强制类型转换依然有效,但是c++中尽可能的避免这种强制类型转换。
a static_cast<要转换成的类型> (变量) //在某一个方向上可以做隐式类型转换,那么在相反的转换方向上就可
以使用static_cast
int *pi = new int(100);
void *pv = pi; // 这个方向上,int* 可以隐式转换成void*
int *pt = pv; // 报错,这个时候在另外一个方向上可以做static_cast<> ()的转换。
b dynamic_cast<类型>(变量) //用在具有多态性的父子类之间。(暂时不讲)
c const_cast<类型>(变量) //专业的去常属性的
const int a = 100;
现在我我要改变a的值。
a = 200; // 显然行不通
int *pa = &a; // 错误,a的地址具有常属性
int *pa = (int*)&pa; // 强制转换,可以
*pa = 200;
cout << *pa << endl; // 值是200
cout << a << endl; // 值是100,这里很奇怪,因为c++编译器有优化技术,只要见到const类型的变量,会
像c语言中的宏一样进行快速替换,从而提高效率,但是上面的那种转换让人很迷惑
int* pa = const_cast<int*>(&a); // c++中专业的去常属性的操作符
d reinterpret_cast<类型>(变量)// 将指针变为整数,将整数转换为地址,即对内存进行重新解释,相当暴力。
又一天结束了。
相关推荐
Yolov2 训练时anchor是如何使用的?build_target
0.简略描述 1.将真值检测框变换到特征图尺度上 2.计算以特征图每个网格中心为中心点时所有锚框与真值检测框的交并比 3.取与真值检测框交并比最大的锚框的id,及真值检测框中心所在cell的id,有此,可将真值检测框与预测结果对应起来 4.计算位置回归损失,置信度损失,分类损失 1,网络的输出 图1 yolov2 网络对于检测框位置大小的输出是: 对于1个batch网络的输出的shape为[batch_size, H*W*num_anchors, 5+num_classes], 其中: num_
C++的运算符重载
1.作为新手学习C++的运算符重载,首先应该了解C++的运算符重载有何现实意义? 之前已对多态性有了相关总结,得出结论:函数重载体现出多态性。实际上,运算符重载也体现出了多态性。在C++中我们定 义的int、float、double等基本数据类型的变量后,就可以直接用“ + ”、“ -”、“ *”、“ / ”等运算符进行相关的计算,然后把得到的 计算 结果通过" ...
Python爬虫实战:从巨潮网批量抓取上市公司年报JSON数据
网络爬虫作为自动化数据采集的核心技术,其原理是通过模拟浏览器行为向服务器发送HTTP请求并解析响应,从而高效获取结构化信息。在金融数据分析领域,这项技术价值尤为突出,能够将研究人员从繁琐的手工数据收集中解放出来,聚焦于更高阶的模型构建与价值挖掘。典型的应用场景包括上市公司财务研究、市场趋势分析和风险预警系统开发。本文以Python的requests库为核心工具,详细解析如何通过分析巨潮资讯网的JSON数据接口,构建一个稳定、高效的上市公司年报数据采集管道,并重点探讨了接口逆向、分页爬取、PDF文件下载等关键
【c++】cpp运算符重载
c++运算符重载
SAP采购申请审批策略配置简介
SAP采购申请审批策略配置简介 1、CT04创建特征
超级全的PCB LAYOUT高速信号走线指南——简化应用版
在PCB Layout中,几乎涵盖了所有的高速信号走线指南。包括了TF/SD、HDMI、LVDS、DVP、eDP、MIPI、USB2.0、USB3.0、MAC、BT.1120、PCIE高速信号等等。此版本为简化版。
c++学习之运算符重载详解
重载++和--运算符时,有点让人不知所措,因为我们总希望能根据他们出现在对象的前面还是后面而来调用不同的重载函数,例如当看见++a,会调用前置加加重载函数,看见a++,会调用后置加加的重载函数。++无论前置还是后置,我们发现他的函数重载时设计的参数将会是一样,但这样就无法确定该调用哪一个,考虑到要让参数不一样而来调用对象的前置函数还是后置函数,于是多利用了一个占位参数。这里我们定义了全局函数的+,重载了+运算符,但程序在对运算符调用时,还是会根据参数类型,调用重载后的运算符,还是调用默认的运算符。
【CASS精品教程】013:CASS9.1生成标准图幅案例教程
在CASS中,可以很方便的生成标准图幅,如50*50。本文演示cass中,根据测区范围标准图幅生成过程。
C++——运算符重载
运算符重载:对数据类型已有的运算符重新进行定义赋予另一种功能,以适应不同的数据类型对于内置数据类型,编译器知道如何进行运算int a = 10;int b = 20;//计算机知道如何计算但是如果是两个自定义的类相加计算机就不知道如何计算,因为加号两边不是系统内置的数据结构。
深度解读华为Limera:从舱内激光视觉融合看前融合技术的发展与演进
华为Limera激光雷达摄像头融合技术推动自动驾驶感知升级 华为推出的Limera创新性地将激光雷达与摄像头深度集成,采用共光路设计实现数据天然对齐,在小型障碍物识别等关键场景展现卓越性能。该产品代表了传感器前融合技术从分立走向共生的演进趋势,通过硬件级集成解决了多源异构数据融合难题。随着索尼堆叠式传感器等技术的出现,未来智能汽车感知系统将向高度集成的"超级传感器"方向发展,实现更精准的环境感知。Limera的发布标志着前融合技术从"可用"迈向"极致&quo
Nerf 训练自有数据
colmap相机位姿转为LLFF格式数据
C++ 运算符重载
C++ 运算符重载. 我们为什么要重载运算符, 以及重载的用途以及好处.
液滴碰撞壁面的过程背景论文——bouncing反弹,spreading扩展,splashing飞溅。铺展过程介绍。还存在很多未解之谜。
【1993-德国-Phenomena of liquid drop impact on solid and liquid surfaces】液滴碰撞壁面的过程背景——bouncing反弹,spreading扩展,splashing飞溅。还存在很多未解之谜。还存在很多未解之谜。不同液滴形状碰撞过程。
「C++系列」重载运算符/重载函数
在C++中,重载运算符允许你为自定义类型(如类)的实例定义运算符的行为。C++ 中的函数重载允许在同一个作用域内定义多个同名的函数,只要这些函数的参数列表(参数的类型、顺序或数量)不同即可。在C++中,大部分运算符都可以被重载,但也有一些运算符是不能被重载的。这些运算符的不可重载性通常是因为它们与语言的底层机制紧密相关,或者是因为它们的行为在语义上不应该被改变。下面是一个简单的函数重载示例,展示了如何根据不同的参数类型来重载。类,表示二维空间中的点,我们想要重载加法运算符,以便可以将两个。
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
CPP运算符重载
文章目录函数的重载运算符重载运算符重载的作用运算符重载的方式典型运算符的重载转换构造函数类型转换函数 函数的重载 1.定义的重载函数必须具有不同的参数个数,或不同的参数类型。编译系统根据不同的参数去调用不同的重载函数,实现不同的功能。 2、仅返回值不同时,不能定义为重载函数。 运算符重载 函数重载是指完成不同功能的函数可以具有相同的函数名。 C++编译器根据函数的实参确定应该调用哪一个函数。 运算...
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
【C++ 】运算符重载
一、运算符重载的基本概念 我们知道C++预定义的运算符,只能用于基本数据类型的运算 如:整型,实型,字符型,逻辑型....... 运算符如:+、-、*、/、%、&、~、!、|、=、<<、>>、!=、..... 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。 二、运算符重载的形式 1、运算符重载的实质是函数重载 2、可以重载为普通函数,也可以重载为成
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
C++运算符重载
文章目录C++运算符重载1. 加号运算符(+)重载代码实现2.左移运算符(cout)重载代码实现3.递增运算符(++)重载代码实现4.赋值运算符(=)重载代码实现5.关系运算符(==)重载代码实现6.函数调用运算符()重载代码实现 C++运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 运算符重载,也可以发生函数重载 1. 加号运算符(+)重载 作用:实现两个自定义数据类型相加的运算 代码实现 #include <iostream> usin
【C++】运算符重载
本篇文章将讲到运算符重载,加号运算符重载,左移运算符重载,递增运算符重载,指针运算符重载,赋值运算符重载,[ ]运算符重载,关系运算符重载,函数调用运算符重载, 以及不要重载&& 和 || 和重载建议。
Cpp实验:运算符重载
运算符重载是C++中的特殊语法,它能够让我们为自定义的类型定义运算符的行为。1. 运算符重载让我们可以为自定义类型定义类似原生数据类型的运算符。比如,我们可以通过重载“+”运算符来实现自定义类型的加法运算。2. 运算符重载遵循一些规则,比如运算符重载函数必须作为类的成员函数或全局函数,不能改变运算符的优先级和结合性,等等。3. 运算符重载可以大大简化代码,提高可读性和可维护性。通过自定义类型的运算符,我们可以直接对自定义类型进行运算操作,不再需要额外的函数调用。
一文读懂C++运算符重载&运算符重载函数
通过运算符重载,扩大了C++已有运算符的作用,使运算符能用于类对象;使用运算符重载,能使程序易于编写、阅读和维护;运算符被重载后,其原有的功能仍然保留,没有丧失或改变。 二、通过运算符重载函数实现运算符的重载 运算符重载函数的一般形式:注:1)形参列表里可以不止一个参数;如果是对象的话,需要“类名&对象名”的形式 1、不允许创造新的运算符,只能对已有的C++运算符进行重载。2、重载不能改变运算符运算量的个数(即操作数),不能改变运算符的优先级,不能改变运算符的结合性。3、重载运算符的函数不能带
【C++学习笔记】C++运算符重载
文章目录C++运算符重载基础教程在全局范围内重载运算符小结C++运算符重载时要遵循的规则C++重载数学运算符(实例演示)到底以成员函数还是全局函数(友元函数)的形式重载运算符简单地了解转换构造函数为什么要以全局函数的形式重载 +为什么要以成员函数的形式重载 +=C++重载>>和<<(输入和输出运算符)详解重载输入运算符>>重载输出运算符<<综合演示C++重载[](下标运算符)详解C++重载++和--(自增和自减运算符)详解C++重载new和delete运算符详
2818



被折叠的 条评论
为什么被折叠?



