#函数探幽

devtools/2025/3/11 8:41:25/

c++内联函数

        内联函数与其他函数的区别(这必须深入到程序的内部):编译的最终产品是可执行程序-----它是由机械语言指令组成。运行时程序,操作系统会把这些指令载入到计算机内存中,分配内存逐步执行。在调用函数时,函数会立即保存该指令地址,并且把参数复制到栈堆(为此保留内存块),调到函数的起点的内存单元执行代码,也许还需将返回值放入寄存器中,跳回到地址保存指令处。而内联函数不需要这样,但是需要占用大量的内存。

        写法:需要在申明和定义前加上inline。

#include <iostream>class MyClass {
public:// 声明时可以加 inlineinline int add(int a, int b);
};// 定义时必须加 inline 才能成为内联函数
inline int MyClass::add(int a, int b) {return a + b;
}int main() {MyClass obj;std::cout << obj.add(3, 4) << std::endl;return 0;
}

 引用变量

        引用必须进行初始化。

        这里说明了引用具有唯一性(不会因为后面的改变而改变一开始引用的值)。

int main()
{
    int tmp = 100;
    int* ptr = &tmp;
    int& ter = *ptr;
    cout <<"&tmp" << & tmp << endl;
    cout <<"&ptr" <<  & ptr << endl;

    cout << "ter" << ter  << &ter<< endl;
    int tmp1 = 200;
    int* ter1 = &tmp1;

    ter = *ter1;
    cout << "ter" << ter << &ter << endl;

}

        

        引用和取地址传参一样可以改变它本身的字值。但需要记住引用传参的和普通函数传参一样。

#include <iostream>// 传值方式交换函数
void swapByValue(int a, int b) {int temp = a;a = b;b = temp;
}// 指针方式交换函数
void swapByPointer(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}// 引用方式交换函数
void swapByReference(int& a, int& b) {int temp = a;a = b;b = temp;
}int main() {int num1 = 10;int num2 = 20;// 传值方式交换测试std::cout << "传值方式交换:" << std::endl;std::cout << "交换前: num1 = " << num1 << ", num2 = " << num2 << std::endl;swapByValue(num1, num2);std::cout << "交换后: num1 = " << num1 << ", num2 = " << num2 << std::endl;// 重置 num1 和 num2 的值num1 = 10;num2 = 20;// 指针方式交换测试std::cout << "\n指针方式交换:" << std::endl;std::cout << "交换前: num1 = " << num1 << ", num2 = " << num2 << std::endl;swapByPointer(&num1, &num2);std::cout << "交换后: num1 = " << num1 << ", num2 = " << num2 << std::endl;// 重置 num1 和 num2 的值num1 = 10;num2 = 20;// 引用方式交换测试std::cout << "\n引用方式交换:" << std::endl;std::cout << "交换前: num1 = " << num1 << ", num2 = " << num2 << std::endl;swapByReference(num1, num2);std::cout << "交换后: num1 = " << num1 << ", num2 = " << num2 << std::endl;return 0;
}
传值方式交换:
交换前: num1 = 10, num2 = 20
交换后: num1 = 10, num2 = 20指针方式交换:
交换前: num1 = 10, num2 = 20
交换后: num1 = 20, num2 = 10引用方式交换:
交换前: num1 = 10, num2 = 20
交换后: num1 = 20, num2 = 10

        使用const引用的三大好处

        (1)使用const可以避免无意间修改了数据。

        (2)使用const使用函数时可以使用const和非const的实参,否则只能接收非const的数据。

        (3)使用const引用能让函数正确的生成并使用临时变量。

        引用结构体时你需要在申明时进行引用

默认参数:

        在函数定义时,可以为函数的参数进行赋值(也可以跳着赋值)。但是需要注意实参给形参传值时只能从左到右依次进行,不能跳过赋值。

#include <iostream>// 定义一个带有默认参数的函数
int add(int a, int b = 10) {return a + b;
}int main() {// 调用函数时提供两个参数int result1 = add(5, 20);std::cout << "Result with two arguments: " << result1 << std::endl;// 调用函数时只提供一个参数,b 使用默认值 10int result2 = add(5);std::cout << "Result with one argument: " << result2 << std::endl;return 0;
}

函数重载:

        函数名相同,函数参数的数量,类型,是否加const,顺序不同为函数重载。 

        原理:编译器是根据实参的类型不同和个数不同,去参数列表来匹配对应的函数进行调用。

#include <iostream>// 计算两个整数的和
int add(int a, int b) {return a + b;
}// 计算三个整数的和
int add(int a, int b, int c) {return a + b + c;
}// 计算两个双精度浮点数的和
double add(double a, double b) {return a + b;
}int main() {// 调用两个整数相加的函数int result1 = add(1, 2);std::cout << "1 + 2 = " << result1 << std::endl;// 调用三个整数相加的函数int result2 = add(1, 2, 3);std::cout << "1 + 2 + 3 = " << result2 << std::endl;// 调用两个双精度浮点数相加的函数double result3 = add(1.5, 2.5);std::cout << "1.5 + 2.5 = " << result3 << std::endl;return 0;
}

 何时使用函数重载:当函数基本执行任务相同时但使用不同类型的数据时,采用函数重载。

函数模版

template<typename T>
void sweap(T& x, T& y)
{
    T temp = x;
    x = y;
    y = temp;
}

        第一行的代码,关键字template,typename,尖括号是必须的,可以使用class来代替typename。后面的T可以使用任意的名称(但是要符合c++的取名规范)。

实例化和具体化

       

template 返回类型 模板名<特定类型>(参数列表); // 函数模板显式实例化
template class 类模板名<特定类型>; // 类模板显式实例化
#include <iostream>// 函数模板
template <typename T>
T add(T a, T b) {return a + b;
}// 类模板
template <typename T>
class Container {
private:T value;
public:Container(T val) : value(val) {}T getValue() const {return value;}
};// 函数模板显式实例化
template int add<int>(int, int);
// 类模板显式实例化
template class Container<double>;int main() {int result = add(1, 2);std::cout << "1 + 2 = " << result << std::endl;Container<double> container(3.14);std::cout << "Container value: " << container.getValue() << std::endl;return 0;
}

警告:试图在同一个文件(或转换单元格)中使用同一种类型的显示实例化和显示具体化将会出错。


http://www.ppmy.cn/devtools/166242.html

相关文章

深入解析K8s VolumeMounts中的subPath字段及其应用

文章目录 前言一、什么是subPath二、subPath使用场景三、场景一示例1.资源准备2.使用subPath字段 四、场景二示例1.资源准备2.测试 前言 在Kubernetes中&#xff0c;挂载存储卷是容器化应用的常见需求。然而当我们将整个卷挂载到容器中的某个目录时&#xff0c;可能会覆盖目标…

深入理解网络通信:从OSI七层模型到TCP/IP协议栈

在网络技术飞速发展的今天&#xff0c;无论是日常浏览网页、在线观看视频&#xff0c;还是企业级的数据交换和云计算服务&#xff0c;背后都离不开复杂而精密的网络通信机制。这些机制确保了数据能够在全球范围内的不同设备间准确无误地传输。为了更好地理解和掌握这一过程&…

HTML页面中divborder-bottom不占用整个底边,只占用部分宽度

根据豆包提示&#xff0c;有2个方案&#xff1a;使用使用伪元素 ::after&#xff0c;使用 linear-gradient 背景 方案1&#xff1a;通过伪元素 ::after 可以创建一个新的元素&#xff0c;并为其设置样式&#xff0c;模拟只显示一半宽度的底部边框。 解释&#xff1a; .half-…

反射是什么?

反射是Java语言的一个强大特性&#xff0c;它允许程序在运行时动态地检查和操作类、方法、字段等。通过反射&#xff0c;你可以实现一些非常灵活的功能&#xff0c;比如动态调用方法、访问私有字段等。 1. 什么是反射&#xff1f; 定义 反射&#xff08;Reflection) 是Java语…

边缘计算盒子:解决交通拥堵的智能方案

在当今的智能交通系统中&#xff0c;边缘计算盒子&#xff08;Edge Computing Box&#xff09;正逐渐成为不可或缺的核心组件。这种设备通过将计算能力下沉到网络边缘&#xff0c;极大地提升了数据处理的速度和效率&#xff0c;特别适用于实时性要求极高的交通监控场景。本文将…

【Python机器学习】1.10. 逻辑回归实战(高阶):超多阶(大于2)的逻辑回归

喜欢的话别忘了点赞、收藏加关注哦&#xff08;关注即可查看全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 1.10.1. 一些准备工作 这篇文章我们会在 1.9. 逻辑回归实战(进阶) 的基础上再进一步&#xf…

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

Python可视化——地理空间型图表(自用)

地图信息可视化的实现就是将不可展开的曲面上的地理坐标信息转化为二维平面进行显示&#xff0c;这个过程也叫地图投影&#xff08;空间三维投影到平面二维&#xff09; 地图投影的要求&#xff1a;等面积、等角度、等距离。总的来说就是映射到二维平面中的任何点通过比例尺放大…