C++中变量的访问权限

一、概述:

c++中的访问权限大致可以分为三种:无连接性、内部链接性、外部链接性;其中,定义在块中(或者说是函数体中的)的变量是无链接性的,比如,

自动变量:

在计算机编程领域, 自动变量 ( Automatic Variable )指的是局部作用域变量,具体来说即是在 控制流 进入变量作用域时系统自动为其分配 存储空间 ,并在离开 作用域 时释放空间的一类变量。

寄存器变量(register ):

在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,C语言\C++语言还定义了一种变量,不是保存在内存上,而是直接存储在CPU中的寄存器中,这种变量称为寄存器变量。

静态局部变量:

该类变量有全局生存区(在程序运行结束时才会销毁),局部作用域(只在定义它的块中可

见); 

而在单文件中定义的、不在任何块中的static变量是具有内部链接性的。它的作用域是单个文件,生存期是全局的;

最后, 在单文件中定义的、不在任何块中的变量是具有外部部链接性的。它的作用域是单个文件,生存期是全局的;此外,需要注意的点是:

可以跨文件访问的全局变量最好在头文件中声明(这使它更好的发挥跨文件访问的作用),但是必须在单个的cpp文件中定义。如果把它定义在头文件中,那么当当多个cpp文件包含该头文件时,就会出现重复定义变量的问题,违反了cpp中的单定义原则;

二、一个特例:

        谈及c++,就不得不提到它的最有名的特性——oop,即面向对象编程;而面向对象编程的第一件事,就是定义一个类(class);类是由结构体演变而来的;c++中类和结构体的区别是:c++中的class的属性的默认访问权限是private,而struct的属性的默认访问权限是public;此外,它们基本没有什么差别,它们的本质都是变量;

        但是,比较特殊的一点是,class的声明不能初始化;还有,class中的属性的访问权限除了受访问修饰符的限定外,还跟类的链接属性有关(类也是一中变量);

        还有一点,就是类的静态成员变量;整个类在声明时编译器不会为类分配空间,只有在实例化一个对象时,才会分配空间(算是对类的真正的定义吧,这个比较特殊);类的静态成员变量必须初始化,也是这个道理,只有初始化以后,这个静态成员变量才算是真正被定义;要说明的一点是,类的静态成员变量的在内存中的储存位置跟这个类的储存位置是分开的,也就是说,类的静态成员变量的储存是独立于整个类的;

三、代码验证;

自己写了一个小demo验证了一下:

#pragma once
#ifndef BASE_H
#define BASE_H
class base
{
public:
	base();
	~base();
	static int a;//这里是a的声明;
	int b;
protected:
};
//这里是a的声明;如果它定义在头文件里,那么在链接的时候,两个.o文件里面都包含a的定义,编译器就会报错;
//因为这样就违反了c++中变量的单定义规则;
#endif
#include "base.h"
#include <iostream>
int base::a = 0;
base::base()
{
	std::cout << "你好世界" << std::endl;
	base::a++;
}

base::~base()
{
	std::cout << "你好世界again" << std::endl;
}
base b;
#include <iostream>
#include "base.h"
//extern class base;
extern base b;//类内函数体外只能定义全局变量和对象,不能执行语句或调用函数。
//base mybase;
int main()
{    
    //类中的static int a跨文件访问;
    std::cout<<base::a++<<std::endl;
    std::cout << base::a++ << std::endl;

    system("pause");
   // std::cout << mybase.a << std::endl;
    return 0;
}

最后,运行结果如下:

本人水平可能还不够,难免会有遗漏之处,欢迎大家指正交流。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值