当前位置: 首页 > news >正文

【和春笋一起学C++】(十七)C++函数新特性——内联函数和引用变量

C++提供了新的函数特性,使之有别于C语言。主要包括:

  1. 内联函数;
  2. 按引用传递变量;
  3. 默认参数值;
  4. 函数重载(多态);
  5. 模版函数;

因篇幅限制,本文首先介绍内联函数和引用变量的定义。

目录

1. 内联函数

2. 引用变量

2.1 创建引用变量

2.2 引用和指针的区别

2.3 引用用作函数参数


1. 内联函数

内联函数是C++为提高程序运行速度所做的一项改进。常规函数和内联函数之间的主要区别在于C++编译器如何将它们组合到程序中。

编译的最终产品是可执行程序,可执行程序由一组机器语言指令组成。程序运行时,操作系统将这些指令载入到计算机的内存中,因此,每条指令都有特定的内存地址,计算机将逐步执行这些指令。

内联函数的运行速度比常规函数稍快,但代价是需要占用更多的内存。

那什么函数适合设置为内联函数?

一般来说,经常被调用且函数运行时间很短的函数适合设置为内联函数。

那怎么设置内联函数呢?首先在函数声明前加上关键字inline,然后在函数定义前也加上关键字inline,但通常的做法是省略函数原型,直接将整个定义放在本应提供原型的地方。

一个关于内联函数的简单实例:

#include <iostream>using namespace std;
inline double square(double x) { return x * x; }
int main()
{double a = 5.0;double b = square(a);double c = square(a + 1);cout << "b= " << b << endl;cout << "c= " << c << endl;return 0;
}

输出值b=25,c=36,表明内联函数和常规函数一样,当参数为表达式,则函数将传递表达式的值,这使得内联函数的功能远远超过了C语言的宏定义。因此,在C++程序中如果使用了C语言的宏执行了类似函数的功能,应考虑将它们转换为C++内联函数(实际上,C语言使用预处理器语句#define来提供宏,是内联代码的原始实现)。


                                                原文为CSDN作者:三月微暖寻春笋 


2. 引用变量

引用变量是C++新增的复合类型,引用是已定义变量的别名。引用变量的主要用途是用作函数参数,通过将引用变量用作函数参数,函数将使用原始数据,而不是其拷贝。除指针外,引用也为函数处理大型结构提供了一种非常方便的用途。

2.1 创建引用变量

C和C++使用&符合来指示变量的地址。C++给&符合赋予了另一个含义,将其用来声明引用,有如下两条语句:

double a = 5.0;
double & b = a;

其中,&不是地址操作符,而是类型标识符的一部分,就像声明指针变量一样,char*指的是指向char的指针,int &指的是指向int的引用。将b声明为a的引用,代表a和b是一样的,在后面的代码中,a和b可以完全互换,a和b的值以及它们指向的内存地址都相同。为了验证这一点,请看下面的小程序:

#include <iostream>using namespace std;
int main()
{double a = 5.0;double & b = a;cout << "a = " << a << ",  b = " << b << endl;cout << "&a = " << &a << ",  &b = " << &b << endl;a++;cout << "a = " << a << ",  b = " << b << endl;cout << "&a = " << &a << ",  &b = " << &b << endl;b++;cout << "a = " << a << ",  b = " << b << endl;cout << "&a = " << &a << ",  &b = " << &b << endl;return 0;
}

程序输出如下:

 程序说明:

上述程序表明,a和b是完全一样的,将a加1意味着将b也加1,将b加1意味着将a也加1,不仅它们的值相同,而且它们的内存地址也相同。

程序中需要注意的是&操作符,如果&操作符的前面有内置类型、结构或对象,则&代表将变量声明为引用,否则&操作符是一个取地址操作符。

对于指针来说,如果*操作符的前面有内置类型,结构或对象,则*代表将变量声明为指针变量,否则*操作符是一个解除引用操作符。

2.2 引用和指针的区别

有以下3条语句:

int a = 2;
int &b = a;
int *c = &a;

上述三条语句表示,b和*c都可以同a互换,&b和c又都可以同&a互换。

引用和指针的区别之一是,引用变量必须在声明时同时进行初始化,而指针可以先声明,再赋值。

引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就必须一直效忠于它。

int a = 2;
int &b = a;
int * const c = &a;

引用b所扮演的角色与*c相同。 

2.3 引用用作函数参数

将引用用作函数参数主要是指将结构的引用或对象的引用用作函数参数。

引用被用作函数参数,使函数中的变量名成为调用程序中的变量的别名,这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。C++新增的这项特性是对C语言的超越。


因篇幅限制,将引用用作函数参数的详细内容放在下篇博客中介绍。

http://www.xdnf.cn/news/867781.html

相关文章:

  • [Java 基础]注释
  • 【LLMs篇】13:LLaDA—大型语言扩散模型
  • 省赛中药检测模型调优
  • 深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
  • 物联网控制技术期末复习 知识点总结 第二章 单片机
  • 【Hive入门】
  • 【网络】select、poll和epoll模型的区别
  • Kafka broker 写消息的过程
  • 突破数据孤岛:StarRocks联邦查询实战指南
  • C语言中易混淆问题【数组指针与指针数组详解】
  • C++内存列传之RAII宇宙:智能指针
  • C#入门学习笔记 #7(传值/引用/输出/数组/具名/可选参数、扩展方法(this参数))
  • WPF可拖拽ListView
  • 质检 LIMS 系统数据防护指南 三级等保认证与金融级加密方案设计
  • 英国2025年战略防御评估报告:网络与电磁域成现代战争核心
  • Axios 取消请求的演进:CancelToken vs. AbortController
  • 【读代码】从预训练到后训练:解锁语言模型推理潜能——Xiaomi MiMo项目深度解析
  • 【android bluetooth 协议分析 12】【A2DP详解 2】【开启ble扫描-蓝牙音乐卡顿分析】
  • 光伏防逆流控制方案
  • .NET Core接口IServiceProvider
  • Spring Boot MVC自动配置与Web应用开发详解
  • Asp.net Core 通过依赖注入的方式获取用户
  • 全志A40i android7.1 调试信息打印串口由uart0改为uart3
  • 六种高阶微分方程的特解(原创:daode3056)
  • Java观察者模式深度解析:构建松耦合事件驱动系统的艺术
  • NC28 最小覆盖子串【牛客网】
  • 基于Axure+墨刀设计的电梯管理系统云台ERP的中保真原型图
  • Apache APISIX
  • CMake入门:3、变量操作 set 和 list
  • 深度学习项目之RT-DETR训练自己数据集