[TOC]
# **变量**
## **变量定义:**
格式:数据类型 变量名
~~~
int i, j, k;
char c, ch;
float f, salary;
double d;
int i=0, j=1, k=99;
~~~
## **变量申明:extern**
当您使用多个文件且只在其中一个文件中定义变量时,变量声明就显得非常有用
~~~
// 变量声明
extern int a, b;
extern int c;
extern float f;
~~~
## **变量作用域**
作用域是程序的一个区域,一般来说有三个地方可以声明变量:
* 在函数或一个代码块内部声明的变量,称为局部变量。
* 在函数参数的定义中声明的变量,称为形式参数。
* 在所有函数外部声明的变量,称为全局变量。
## **初始化局部变量和全局变量**
当**局部变量**被定义时,系统**不**会对其**初始化**,您必须自行对其初始化。
定义全局变量时,系统会自动初始化为下列值:
| 数据类型 | 初始化默认值 |
| --- | --- |
| int | 0 |
| char | '\\0' |
| float | 0 |
| double | 0 |
| pointer | NULL |
## **C++ 存储类**
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:
* auto
* register
* static
* extern
* mutable
### auto 存储类
**auto**存储类是所有局部变量默认的存储类。
~~~
{
int mount;
auto int month;
}
~~~
上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量。
### register 存储类
**register**存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。
~~~
{
register int miles;
}
~~~
寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 'register' 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
### static 存储类
**static**存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
在 C++ 中,当 static 用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。
~~~
#include <iostream>
// 函数声明
void func(void);
static int count = 10; /* 全局变量 */
main()
{
while(count--)
{
func();
}
return 0;
}
// 函数定义
void func( void )
{
static int i = 5; // 局部静态变量
i++;
std::cout << "i is " << i ;
std::cout << " and count is " << count << std::endl;
}
~~~
当上面的代码被编译和执行时,它会产生下列结果:
~~~
i is 6 and count is 9
i is 7 and count is 8
i is 8 and count is 7
i is 9 and count is 6
i is 10 and count is 5
i is 11 and count is 4
i is 12 and count is 3
i is 13 and count is 2
i is 14 and count is 1
i is 15 and count is 0
~~~
### extern 存储类
**extern**存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用*extern*来得到已定义的变量或函数的引用。可以这么理解,*extern*是用来在另一个文件中声明一个全局变量或函数。
extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:
第一个文件:main.cpp
~~~
#include <iostream>
int count ;
extern void write_extern();
main()
{
count = 5;
write_extern();
}
~~~
第二个文件:support.cpp
~~~
#include <iostream>
extern int count;
void write_extern(void)
{
std::cout << "Count is " << count << std::endl;
}
~~~
在这里,第二个文件中的*extern*关键字用于声明已经在第一个文件 main.cpp 中定义的 count。现在 ,编译这两个文件,如下所示:
~~~
$g++ main.cpp support.cpp -o write
~~~
这会产生**write**可执行程序,尝试执行**write**,它会产生下列结果:
~~~
$./write
5
~~~
### mutable 存储类
**mutable**说明符仅适用于类的对象,这将在本教程的最后进行讲解。它允许对象的成员替代常量。也就是说,mutable 成员可以通过 const 成员函数修改。
# **常量**
常量又叫做**字面量**,是固定值,在程序执行期间不会改变。
### 定义常量
在 C++ 中,有两种简单的定义常量的方式:
* 使用 **#define** 预处理器。
* 使用 **const** 关键字。
使用 **#define** 预处理器。
~~~
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
~~~
使用 **const** 关键字。
```
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
```
- Visual Studio 2022安装到非C盘
- vscode轻量编辑器
- c#(csharp)
- .net平台区别
- 常用单词
- 关键字
- 操作符(运算符)
- 标识符(命名规范)
- 开始
- 变量
- 常量
- 数据类型
- 值类型
- 变量数据类型
- 枚举类型enum(常量集合)
- 结构类型struct(结构体)
- 元组类型
- 可null类型(T?)
- 引用类型
- 数组(array)
- 集合(List)
- 内置引用类型
- object
- string
- Dynamic(动态类型)
- delegate委托(代理)类型
- 自定义引用类型
- 接口(interface)
- 类class
- record(定义一个引用类型)
- 指针类型(仅用于非安全代码)
- get和set访问器
- delegate委托
- delegate实现发布订阅与事件
- 类型转换
- 合并操作符??
- 类相关
- Partial 部分类
- 类定义以及访问修饰符(封装)
- abstract抽象类与sealed密封类
- virtual虚方法
- 接口interface
- C# 预处理器指令
- C#技术栈
- 判断(流程控制)与三元运算
- if
- switch
- 三元运算
- 循环
- while 循环
- for循环
- foreach循环
- do...while 循环
- 文件操作
- 其他
- 多开
- c++
- 基本语法
- c++数据类型
- 变量和常量
- 运算符
- 分支结构(判断)
- 循环
- c++指针
- 函数
- 内置函数
