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

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的值设置为20
    std::cout << a << std::endl;  // 输出20

    return 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.kler.cn/a/373573.html

相关文章:

  • 前端开发:表格、列表、表单
  • 【AI游戏】基于OpenAI打造自动生成剧情的 Python 游戏
  • UnityXR Interaction Toolkit 如何检测HandGestures
  • SOME/IP 协议详解——服务发现
  • pandas与sql对应关系【帮助sql使用者快速上手pandas】
  • 【论文阅读】MAMBA系列学习
  • 【网络】传输层协议TCP(中)
  • 对csv文件进行分组和排序详解(使用面部表情数据集fer2013)
  • 新160个crackme - 088-[KFC]fish‘s CrackMe
  • Spring5学习记录(二)之IOC容器管理(基于注解方式)
  • Python(包和模块)
  • VB中的安全性考虑,如防止SQL注入、XSS攻击等
  • 【安全解决方案】深入解析:如何通过CDN获取用户真实IP地址
  • 「Mac畅玩鸿蒙与硬件6」鸿蒙开发环境配置篇6 - 理解鸿蒙项目结构
  • C++的输入与输出
  • Android Handler消息机制(五)-HandlerThread完全解析
  • 【Linux网络】UdpSocket
  • 网络安全知识见闻终章 ?
  • 深度学习基础(2024-10-30更新到tensor相关)
  • 灵动AI:科技改变未来
  • Linux 线程概念
  • 安装使用docker harbor并推送镜像到仓库
  • 3个方法将苹果手机照片备份至苹果电脑
  • python:ADB通过包名打开应用
  • 华为OD机试真题-任务最优调度-2024年OD统一考试(E卷)
  • 我自己的资料整理导引(二):知识循环笔记法