存储持续性、作用域和链接性

本文详细介绍了C++中变量的存储持续性、链接性,包括外部链接性、内部链接性和无链接性的静态变量。通过示例解释了它们在不同作用域和文件间的访问规则,以及cv-限定符、mutable和函数链接性的概念。了解这些基础知识对于提升C++编程技能至关重要。
摘要由CSDN通过智能技术生成

作用域:描述了名称在文件的多大范围内可见;

链接性:描述了名称如何在不同单元间共享;

​ 外部链接性:可在其他文件中访问;

​ 内部链接性:只能在当前文件中访问;

​ 无链接性:只能在当前函数或代码块中访问。

自动存储持续性

在默认情况下,在函数中声明的函数参数和变量的存储持续性为自动的,作用域为局部,没有链接性;

如果在代码块中定义了变量,则改变量的存在时间和作用域将被限制的该代码块内;

int main()
{
  int a = 0;
  for(int i = 0; i < 2; i++)
  {
     int a = 1;
  }
}

如果出现上述情况,则在执行内部代码块的时候会自动隐藏外部代码块中的同名变量a,当内部代码块执行完毕之后,外部代码块中的a又变为可见的。

静态持续变量

静态持续变量有三种链接特性:外部链接性、内部链接性、无链接性

外部链接性的静态变量

想要创建这种变量,必须在代码块的外面声明它。

在其他文件中访问需要添加extern说明符(引用声明)。

//源.cpp
#include"fun.h"
#include<iostream>
using namespace std;
int money = 0;
int main()
{
    add_money();
    cout << money;  //输出1
    return 0;
}
//fun.h
void add_money();
//fun.cpp
#include"fun.h"
void add_money()
{
    extern int money;    //extern表示引用声明,告诉编译器money的定义去其他文件找
    money++;  
}

内部链接性的静态变量

要想创建这种变量,必须在代码块的外面声明它,并使用static限定符

注:在代码块的外面使用const加以限定,那么在其他文件也不能访问

//源.cpp
#include"fun.h"
#include<iostream>
using namespace std;
static int person = 0;
const int money = 0;
int main()
{
    fun();
    cout << person << money;
    return 0;
}
//fun.h
void fun();
//fun.cpp
#include"fun.h"
void fun()
{
    const int money;//错误,无法访问外部符号
    extern int person;//错误,无法访问外部符号
}

无链接性的静态变量

要想创建这种变量,必须在代码块的里面声明它,并且使用static限定符。

#include<iostream>
using namespace std;
class Person
{
public:
    static int money; //要记得初始化
};
int Person::money = 0;//类的静态数据成员须在类外初始化,常静态数据成员可以在类内初始化
int main ()
{
    money++;//错误,money的作用域在Person类中
    return 0;
}

限定符和说明符

cv-限定符

cv表示const和volatile

const表明内存被初始化之后,程序员不能再对其进行修改。

volatile表明即使程序代码没有对内存单元进行修改,其值也可能发生改变。该关键字的作用是为了改善编译器的优化能力。这里笔者不是很懂,就不写那么多了。

mutable

mutable表明即使类和结构体对象为const,其某个成员也可以修改。

#include<iostream>
using namespace std;
class Person
{
public:
    mutable int money;  
    int age;
};
int main()
{
    const Person p1;//创建常对像p1
    p1.money = 1;//正确money被volatile限定
    p1.age = 18;//错误,常对象不能修改其内部成员
    return 0;
}

函数的链接性

首先C++不允许在一个函数中定义另一个函数,因此所有函数的存储持续性都自动为静态的,即在整个程序执行期间都一直存在。

其次,在默认情况下,函数的链接性为外部的,即可以在文件间共享。实际上可以在函数原型中使用关键字extern来指出函数是在另一个文件中定义的,不过这是可选的(要让程序在另一个文件中查找函数,该文件必须作为程序的组成部分被编译,或者是由链接程序搜索的库文件)。

最后,还可以使用关键字static将函数的链接性设置为内部的,使之只能在一个文件中使用,但必须同时在函数原型和函数定义中使用。**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值