逆向基础--C++ 作用域、常量、修饰符类型 (03)
一. 作用域介绍
局部作用域:在函数内部声明的变量具有局部作用域,它们只能在函数内部访问。局部变量在函数每次被调用时被创建,在函数执行完后被销毁。
全局作用域:在所有函数和代码块之外声明的变量具有全局作用域,它们可以被程序中的任何函数访问。全局变量在程序开始时被创建,在程序结束时被销毁。
块作用域:在代码块内部声明的变量具有块作用域,它们只能在代码块内部访问。块作用域变量在代码块每次被执行时被创建,在代码块执行完后被销毁。
类作用域:在类内部声明的变量具有类作用域,它们可以被类的所有成员函数访问。类作用域变量的生命周期与类的生命周期相同。
注意:如果在内部作用域中声明的变量与外部作用域中的变量同名,则内部作用域中的变量将覆盖外部作用域中的变量。在C#中会编译出错,但C++中不会,如下代码所示:
class MyClass { public: int Total = 10; void tempFunc() { int Total = 100; //最终输出100 std::cout << "Total:" << Total; } };
1.1 局部作用域 ---在函数内部声明的变量具有局部作用域,它们只能在函数内部访问
int main () { // 局部变量声明 int a, b; int c; // 实际初始化 a = 10; b = 20; c = a + b; cout << c; }
1.2 全局变量---通常是在程序的头部,函数和代码块之外声明的变量具有全局作用域
// 全局变量声明 int g; int main () { // 局部变量声明 int a, b; // 实际初始化 a = 10; b = 20; g = a + b; cout << g; }
1.3 块作用域--只能在代码块内部访问
if (a == 10) { short c = 20; //块作用域 }
1.4 类作用域
// MyClass要放在上面,注意类定义顺序问题 class MyClass { public: static std::string UserName;//声明 并不分配存储空间 /* inline 声明即定义,从 C++17 开始引入的特性 有这个特性Address就不需要静态成员类外定义,与C#、java写法类似 */ inline static std::string Address = "湖南长沙"; }; //静态成员需要类外定义 std::string MyClass::UserName="张三"; //定义,分配存储空间 int main() { std::cout << MyClass::UserName+"\n"; std::cout << MyClass::Address; }
二.常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
2.1 整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),
L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
//以下是各种类型的整数常量的实例 85 // 十进制 0213 // 八进制 0x4b // 十六进制 30 // 整数 30u // 无符号整数 30l // 长整数 30ul // 无符号长整数
2.2 浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分 或 小数部分,或同时包含两者。
当使用指数形式表示时, 必须包含小数点 或 指数 或同时包含两者。带符号的指数是用 e 或 E 引入的。
后缀 'f' 或 'F' 表示 float 类型
//下面列举几个浮点常量的实例 3.14159 // 合法的 314159E-5L // 合法的,指数部分是E-5表示乘以10的-5次方 ==314159 * 10^(-5),L表示长整数 .5 // 合法的 5. // 合法的 .5e-5 // 合法的 0.5乘以10的-5次方 5.e0 // 合法的 5乘以10的0次方 510E // 非法的:不完整的指数 210f // 非法的:没有小数或指数 .e55 // 非法的:缺少整数或分数
2.3 定义常量
在 C++ 中,有两种简单的定义常量的方式:1)使用 #define 预处理器; 2)使用 const 关键字
在C++中,推荐使用const代替#define来定义常量,因为const提供了类型安全和作用域。
请注意,把常量定义为大写字母形式。
#include <iostream> using namespace std; int main() { const int LENGTH = 10; const int WIDTH = 5; const char NEWLINE = '\n'; int area; area = LENGTH * WIDTH; cout << area; cout << NEWLINE; }
三. 修改符类型
C++ 允许在 char、int 和 double 数据类型前放置修饰符。下面表格列出了数据类型修饰符
| 数据类型 | 描述 |
| signed --有符号类型 | 表示变量可以存储负数。对于整型变量来说,signed 可以省略,因为整型变量默认为有符号类型 |
| unsigned --无符号类型 | 表示变量不能存储负数。对于整型变量来说,unsigned 可以将变量范围扩大一倍。 |
| short | 表示变量的范围比 int 更小。 short int 可以缩写为 short。如 short int x=1000, 或简写short x=1000 |
| long |
表示变量的范围比 int 更大。long int 可以缩写为 longt。如 long int x=100000000, 或简写long x=100000000 |
| long long | 示变量的范围比 long 更大。C++11 中新增的数据类型修饰符 |
| float | 表示单精度浮点数 |
| double | 表示双精度浮点数 |
| bool | 表示布尔类型,只有 true 和 false 两个值 |
| char | 表示字符类型 |
| wchar_t | 表示宽字符类型,可以存储 Unicode 字符 |
下面是变量声明定义的示例
signed int num1 = -10; // 定义有符号整型变量 num1,初始值为 -10 unsigned int num2 = 20; // 定义无符号整型变量 num2,初始值为 20 short int num1 = 10; // 定义短整型变量 num1,初始值为 10 long int num2 = 100000; // 定义长整型变量 num2,初始值为 100000 long long int num1 = 10000000000; // 定义长长整型变量 num1,初始值为 10000000000 float num1 = 3.14f; // 定义单精度浮点数变量 num1,初始值为 3.14 double num2 = 2.71828; // 定义双精度浮点数变量 num2,初始值为 2.71828 bool flag = true; // 定义布尔类型变量 flag,初始值为 true char ch1 = 'a'; // 定义字符类型变量 ch1,初始值为 'a' wchar_t ch2 = L'你'; // 定义宽字符类型变量 ch2,初始值为 '你'
浙公网安备 33010602011771号