打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++|变量的类型系统和属性

变量是一个内存单元的命名以及对应的一段比特的编码和解码,涉及到数据类型、存储属性。

变量的数据类型是所有编程语言都需要考虑的语法特征。区别在于数据类型检查与推断是发生在编译期还是运行期,前者特性的编程语言一般称为静态类型语言,后者特性的编程语言一般称之为动态类型语言。

静态类型编程语言一般要求在编译期检查类型的安全性,可以实现错误的早期发现机制,一定程度上提高了程序的严谨性,代码的健壮性和运行的效率,为此对于变量的要求是先声明后使用。静态的语义解释可以以空间换时间,可以有静态优化。

1 数据类型的表达规则

数据类型的表达规则包括内存布局与格式的内存表达,使用内存单元的字节(byte)数量,以及编码和解码规则,同时也确定了数据类型的值域。

对于自定义类型,其数据成员在内存中连续存储,并按内存对齐规则进行对齐。

2 数据类型的操作规则

基本数据类型的操作规则通过上下文的操作符来定义,操作符也相当于一个特殊的函数,操作符有一元操作符、二元操作符和三元操作符,相当于特殊函数的参数数量。

2.1 算子(操作数);

2.2 溢出规则;

2.3 异常处理规则;

对于自定义类型,操作规则由成员函数来定义,或者重载操作符(也是特殊的成员函数)来定义。

3 数据类型的转换规则

当声明、定义和初始化了一个变量时,也就是对其值按类型规则进行编码并对内存的比特进行初始化后,该比特串就可以按编码规则解码为对应类型的数据,如果想解码为其他类型,也就是所谓的类型转换,C++编译器必须定义相应的转换规则,如浮点数转换成整数的小数点舍去规则等。

包括C风格的强制类型转换,C++的static_cast、dynamic_cast、reinterpret_cast。

4 模板支持

C++支持函数模板和类模板来实现数据类型的泛化,函数模板调用时,可以进行自动类型推断。而类模板需要使用基本类型进行类的实例化。

5 变量的存储属性和作用域、生命期、链接性

在C++中,程序可以是多文件程序,先编译,后链接,所以对于跨文件引用的全局变量,需要先用关键字extern声明,告诉编译期,这是一个在别外定义的全局变量。如果某一全局变量不想被跨文件使用,可以用static来修饰,限定其不能跨文件引用。在C++中,static除了空间使用(也就是链接性)的上下文,还有时间上的上下文,可以修饰为静态变量,其生命期从声明位置开始,一直延续到程序结束。

复合语句(或块,包括函数语句块)内定义的变量称为局部变量,其作用域与生命期从声明和定义位置开始,到语句块结束位置结束。局部变量在栈内存区分配空间

复合语句(或块,包括函数语句块)外定义的变量称为全局变量,其作用域与生命期从声明和定义位置开始,到程序结束时结束(也就是main函数结束时)。全局变量根据是否有初始化而分配在内存的全局\静态数据区的数据段和BSS段。

在C++中,可以在程序运行期申请堆内存,这样的变量称为动态变量,一般使用指针申请,申请使用完后需手工释放堆内存,释放内存的操作并没有改变原有指针的指向,为了避免错误,建议的做法是将指针更新为NULL。

所以存储属性及在内存中的区域与变量声明和定义时使用的存储属性关键字和声明的位置有关。

6 变量的类型修正符modifier

在C++中,变量的声明和定义除了使用存储属性关键字、类型声明以外,还可以使用类型修正符,对原型进行一些修改和限制。

C++使用const、volatile和mutable三个类型修正符。

7 变量的声明与定义

在C++中,变量定义时要求声明数据类型,会分配内存空间,所以变量的定义同时也是声明。在C++中单独的声明只有使用extern的情形,如extern int var;分两种情况,一是extern int var;处于局部作用域,但在此后的全局作用域中,有var定义:int var; 另外一种情形是extern int var;声明在全局作用域中,表示在其它文件的全局作用域中有int var;的定义。另外,对于函数的形参,也可以理解为一种函数参数局部作用域的声明。

需要注意的是,自定义的结构类型也有声明与定义,如类类型,当涉及到类A的数据成员有类B的变量,当类B未定义时,可以先声明类B,再定义类A和类B。此后便可以声明和定义类A或类B的变量(或称为实例、对象)。

8 变量的值语义

变量的地址属性和值属性可以理解为左值和右值。

变量的值语义可以做为函数的形参与实参,作为函数的函数返回值。当形参用实参来初始化,函数返回指定类型时,可能存在隐式类型转换。

值语义用于函数的入参和返回值可能造成大量的临时变量和冗余拷贝。

9 变量的自洽性

变量的自洽性是指变量的生命周期是独立的、可控的、不受外部环境影响的。因此自洽的变量很容易被持久化。

一个变量的自洽性满足下列的四个条件

9.1 具有值语义;

9.2 具有独立的生命周期;

9.3 可以轻易地被持久化;

9.4 可以在不同的系统中等价地存在;

10 变量的总分性

变量的总分性是指一个变量不仅是独立的变量,还是其他变量的成员变量,如结构体和类类型的变量与其成员变量。

11 变量的多态性

基类指针变量的多态性,用于类在继承关系中的虚函数的动态重载。

12 临时变量

在计算机程序的计算过程中,中间结果往往是由临时变量来存储的。

字符串字面量做右值时也会产生一个临时变量。

函数是可以将临时变量的值作为返回值的,同时,在类类型中重载赋值运算符后使用赋值运算符时,右值会产生一个临时对象。

-End-

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++ 词汇解析集锦
函数(Functions)
IT面试手册
C 基础知识
JavaScript秘密花园
跟我学习javascript的undefined与null
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服