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

C++变量声明与定义(有对引用的解释)

一.extern

 如果想声明一个变量而非定义它,就使用关键字extern并且不要显式地初始化变量:

extern int i;      // 声明i而非定义i
extern int i = 1;  // 定义i, 这样做抵消了extern的作用

二.static

当我们在C/C++用static修饰变量或函数时,主要有三种用途:

  • 局部静态变量
  • 外部静态变量/函数
  • 类内静态数据成员/成员函数

其中第三种只有C++中有,我们后续在面向对象程序设计中再探讨,这里只讨论静态局部/全局变量。

1. 静态局部变量

在局部变量前面加上static说明符就构成静态局部变量,例如:

// 声明局部静态变量
static int a;
static int array[5] = {1, 2, 3, 4, 5};
  • 静态局部变量在函数内定义,但不像自动变量那样当函数被调用时就存在,调用结束就消失,静态变量的生存期为整个源程序
  • 静态变量的生存期虽然为整个源程序,但是作用域与自动变量相同,即只能在定义该变量的函数内使用该变量,退出函数后虽然变量还存在,但不能够使用它
  • 对基本类型的静态局部变量如果在声明时未赋初始值,则系统自动赋0值;而对普通局部变量不赋初始值,那么它的值是不确定的

根据静态局部变量的特点,它的生存期为整个源程序,在离开定义它的函数(作用域)但再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量,虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此最好采用局部静态变量。例如:

#include <iostream>void foo() {int j = 0;         // 普通局部变量static int k = 0;  // 静态局部变量++j;++k;printf("j:%d, k:%d\n", j, k);
}int main(void)
{for (int i = 1; i <= 5; i++) {foo();}
}// 输出:
j:1, k:1
j:1, k:2
j:1, k:3
j:1, k:4
j:1, k:5

Tips:普通局部变量的生命周期仅限于它们所在的作用域。例如,如果一个局部变量在函数内部定义,那么它在函数调用时创建,在函数返回时销毁。

三. 引用

1.概念

  • 引用一旦初始化,就不能再指向其他对象:与指针不同,引用在初始化后就不能被重新赋值。

  • 引用必须被初始化:在声明引用时,必须立即用另一个变量来初始化它。

  • 引用不是对象:引用仅仅是一个已存在对象的别名,并不占用额外的存储空间。(起别名)

  • 引用的操作实际上是对引用所指向的对象的操作对引用的任何操作实际上都是对它所引用的对象的操作。

 2.声明引用

int main() {int a = 10;int &ref = a;  // ref是变量a的引用return 0;
}

 在这个例子中,refa的引用,对ref的操作实际上就是对a的操作。

3.使用引用

int main() {int a = 10;int &ref = a;ref = 20;  // 这实际上是将a的值设置为20std::cout << a << std::endl;  // 输出20return 0;
}

 在这个例子中,通过引用ref改变了变量a的值。

4.引用作为函数参数

引用常用于函数参数,以允许函数直接修改传入的参数。

void swap(int &x, int &y) {int temp = x;x = y;y = temp;
}int main() {int a = 10, b = 20;swap(a, b);  // a和b的值将会交换return 0;
}

在这个例子中,swap函数通过引用参数交换了两个整数的值。 


http://www.mrgr.cn/news/62769.html

相关文章:

  • Metasploit渗透测试之无线网络安全测试
  • 第十九章 Vue组件之data函数
  • Efficient Adaptive Matching for Real-Time City Express Delivery
  • Spring 设计模式之装饰器模式
  • 第三百零一节 Lucene教程 - Lucene索引文件
  • GPU 学习笔记四:GPU多卡通信(基于nccl和hccl)
  • JAVA开发入门
  • Mysql 日志
  • 开启TikTok直播的全攻略:从网络条件到设备准备
  • 嵌入式软件信号量、互斥功能实现,解决不可重入性
  • 编程之路:蓝桥杯备赛指南
  • 安科瑞AM5SE-IS 防逆流保护装置 功能全面 逆功率保护
  • 【Hive sql 面试题】用一条sql语句查询出每门课都大于80分的学生姓名
  • hive将包含逗号的字段拆分为多列
  • chrome编辑替换js文件的图文教程
  • 易考八股文之SpringBoot和SSM的优缺点
  • 搜维尔科技:Win8 VR生产安全,多平台兼容,实时反馈与指导
  • 持续基础怎么搞?Jenkins+Docker+Git实战
  • 大模型常见依赖库的安装问题汇总
  • 在Java中 try catch 会影响性能吗?
  • 结构体数组复习
  • (蓝桥杯C/C++)——STL(下)
  • 【微服务】Nacos 注册中心
  • 17. 从尾到头打印链表
  • 白盒测试基本概念(学习笔记)
  • Redis数据库