C++ 类和对象 (查漏补缺)

news2024/11/23 23:37:37

 Inline

内联函数

内联函数是为了替代宏函数而出来的。

下面用宏实现一个ADD宏函数:

为什么这个ADD宏函数要这么写,首先我们来看,假设这样写:

#define ADD(x,y)(x+y)

会有什么问题呢?

宏函数是直接替换了:

3|4+3&4=3|7&3

我们发现因为优先级问题,宏函数的直接替换导致结果偏离了我们的预设。

所以我们需要加括号保证优先级,但是这样太麻烦了,如果是一个ADD函数就不用这么麻烦:

 因为ADD函数不像ADD宏函数那样无脑替换,它会进行先把实参算完再拿过来给形参,把形参算完之后再返回。

但是函数的调用需要建立栈帧,假如我们需要调一万次ADD函数呢?那这个开销就比较大了,我们可以把ADD函数设为内敛函数:

普通函数:

 内联函数:

 内联不会展开,也就是可以把这个函数的功能拿过来直接用,而不用建立栈帧。

成员变量的命名风格

 

下文这样来初始化一个日期类的成员变量

#include<iostream>
using namespace std;


class Data
{
public:
	void Init(int year,int month,int day)
	{
		year = year;
		month = month;
		day = day;

	}


private:
	int year;
	int month;
	int day;
};
int main()
{

	Data T;
	T.Init(2003,11,29);
	return 0;
}

我们发现并没有初始化上:

 原因:

 

这样写加以区分:

#include<iostream>
using namespace std;


class Data
{
public:
	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;

	}


private:
	int _year;
	int _month;
	int _day;
};
int main()
{

	Data T;
	T.Init(2003,11,29);
	return 0;
}

类的实例化

有这样一个日期类:



class Data
{
public:
	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;

	}


private:
	int _year;
	int _month;
	int _day;
};

即然有类域,那我们可以这样访问吗?
 

Data::_year;
Data._year;

不可以,因为我们私有的成员变量只是一个声明:

 只有声明是不能直接拿来用的,我们需要定义:

	Data T;

现在定义了一个变量T,就开辟了一块空间,_year,_month,_day的空间也被一把开出来了。

拷贝构造

有如下这么两个类,一个日期类,一个栈类

typedef int DataType;
class Stack
{
public:
	Stack(size_t capacity = 3)
	{
		cout << "Stack()" << endl;
	}

	// s1(s)
	Stack(const Stack& s)
	{
		cout << "Stack(Stack& s)" << endl;
	
	}

	void Push(DataType data)
	{
		// CheckCapacity();
		_array[_size] = data;
		_size++;
	}

	~Stack()
	{
		cout << "~Stack()" << endl;
	}
private:
	// 内置类型
	DataType* _array;
	int _capacity;
	int _size;
};
class Data
{
public:
	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;

	}
private:
	int _year;int _month;int _day;
};

现在还有一个fun函数,我们把栈类的值拷贝给这个fun函数:

void fun(Data a)
{

}

int main()
{
	
	Data T;
	T.Init(2003,11,29);
	fun(T);


	return 0;
}

如果我们把日期类拷贝给fun函数就不会蹦:


void fun1(Data s)
{

}


int main()
{
	Data T;
	T.Init(2003,11,29);
	fun1(T);

return 0;
}

如果我们把栈来拷贝给fun函数就会蹦:

void fun2(Stack s)
{

}



int main()
{
   Stack s1;
	
	fun2(s1);

return 0;

}

我们可以画图解析一下:

如图,stack的int*_a是在堆上面开辟的空间,内容存在堆上的,_a指向堆。

fun是stack的浅拷贝,fun的_a也指向同一块地址。

 fun后调用,先结束生命周期,先调用析构。此时就把这块空间释放掉了,那么轮到stack的时候会再次调用析构,会再把这块空间释放一次。

看下面这个图,a和s1的_array都指向堆上的同一块地址:

fun函数先析构:

stack再去析构的时候就会报错,因为stack的_a此时是一个野指针,指向了一块已经被释放了的空间:

 

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

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

相关文章

FileInputStream文件字节输入流

一.概念 以内存为基准&#xff0c;把磁盘文件中的数据以字节形式读入内存中 二.构造器 public FileInputStream(File file) public FileInputStream(String pathname) 这两个都是创建字节输入流管道与源文件接通 三.方法 public int read() :每次读取一个字节返回&#xff0c;如…

设计模式:原型模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《访问者模式》 下一篇《享元模式》 简介&#xff1a; 原型模式&#xff0c;它是一种创建型设计模式&#xff0c;它允许通过复制原型对象来创建新的对象&#xff0c;而无需知道创建的细节。其工作原…

安装Spring Tool Suite 4的一些问题

1、安装lombok.jar &#xff08;1&#xff09;把lombok.jar放到Spring Tool Suite 4的根目录下&#xff0c;java -jar lombok.jar&#xff0c;选择Spring Tool Suite 4&#xff0c;安装。然后SpringToolSuite4.ini里面会自动写入一行 sts4需要额外配置一行参数【-javaagent:lo…

springboot+mybatis-plus实现读写分离

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 最近shigen加班也比较严重&#xff0c;很多天文章没有更新了&#xff0c;各位读者和伙伴见…

2023/10/28 JAVA学习

导入模块 找到模块路径后,复制到上面,注意导入的是这个 还需要注意,这样导入的话,可能模块不在同一个工程文件里,如果不小心删除这个模块,就不能使用了,所以建议,把原本模块先复制到工程文件中,然后再找模块路径,进行上面操作 还有一种方式新创一个模块,然后把想要导入的模块代…

不一样的网络协议-------KCP协议

1、kcp 的协议特点 1.1、RTO 不翻倍 RTO(Retransmission TimeOut)&#xff0c;重传超时时间。tcp x 2&#xff0c;kcp x 1.5&#xff0c;提高传输速度 1.2、选择重传 TCP丢包时会全部重传从该包开始以后的数据&#xff0c;而KCP选择性重传&#xff0c;只重传真正丢失的数据包…

『力扣刷题本』:移除链表元素

一、题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&a…

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab实现ARIMA-LSTM差…

开源B2B网站电子商务平台源码下载搭建 实现高效交易的桥梁

随着互联网的普及和电子商务的快速发展&#xff0c;B2B&#xff08;Business-to-Business&#xff09;网站电子商务平台在商业领域中发挥着越来越重要的作用。通过开源B2B网站电子商务平台源码搭建&#xff0c;企业可以构建自己的电子商务平台&#xff0c;实现高效交易的桥梁。…

Claim Proof Bug——Aztec最大的45万美金bug bounty

1. 引言 近期&#xff0c;Aztec Labs通过其Immunefi bug bounty program&#xff0c;发出了其有史以来最大的bug bounty——45万美金&#xff0c;给白帽独立安全研究员lucash-dev&#xff0c;以感谢其所发现的Aztec Connect Claim Proof Bug&#xff0c;基本时间轴为&#xff…

EASEX绘制卡通头像

#include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #define PI 3.14 // 1PI 180度 2PI 360度int main() {// 创建1024*1024的窗体initgraph(1024, 1024);// 将背景颜色设施为白色setbkcolor(WHITE);cleardevice();// to…

Leetcode刷题详解——不同路径

1. 题目链接&#xff1a;62. 不同路径 2. 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”…

【python练习】python斐波那契数列超时问题

计算斐波那契数列第n项的数字 Description计算斐波那契数列第n项的数字&#xff0c;其中f(1)f(2)1,f(n)f(n-1)f(n-2)&#xff0c;如1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5,......Input 正整数n(n<100)Output 一个整数f(n)Sample Input 1 8 Sample Output 1…

【数据结构实战项目】C语言实现数据结构顺序表万字详解(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个顺序表: 该顺序表使用动态内存分配,可以用来存储任意数量的同类型数据. 顺序表需要包含三个要素:存储数据的数组arr,顺序表…

Pandas透视表

Pandas使用pivot_table()方法和crosstab()方法实现透视表。 pivot_table()方法及参数 pivot_table()方法的语法格式如下&#xff1a; pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameA…

10月份程序员书单推荐

新书书单 1、C程序设计教程&#xff08;第9版&#xff09; 1.广受认可的《C程序设计教程》系列的第9版&#xff08;个别版本也译作《C语言大学教程》&#xff09;&#xff0c;秉承了该系列一贯的丰富而详细的风格。该系列一些版本因封面画有蚂蚁形象而被称为“C语言蚂蚁书”。…

有一个带头结点的单链表L,设计一个算法使其元素递增有序

有一个带头结点的单链表L&#xff0c;设计一个算法使其元素递增有序 代码思路&#xff1a; 我这里懒得搞那个指针了&#xff0c;直接遍历一遍链表&#xff0c;把链表的元素复制到数组arr里面 对数组A进行一下排序&#xff0c;排完之后再把元素复制到L里面。 至于排序你用啥算…

构建外卖小程序:技术要点和实际代码

1. 前端开发 前端开发涉及用户界面设计和用户交互。HTML、CSS 和 JavaScript 是构建外卖小程序界面的主要技术。 <!-- HTML 结构示例 --> <header><h1>外卖小程序</h1><!-- 其他导航元素 --> </header> <main><!-- 菜单显示 -…

Capacitor 打包 h5 到 Android 应用,uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED

Capacitor 打包 h5 到 Android 应用&#xff0c;uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED capacitor 官网&#xff1a; https://capacitorjs.com/docs/ 项目上需要做一个 app&#xff0c;而这个 app 是用 uniapp 做的&#xff0c;里面用到了一个依赖 dom 的库&…