C++中const的使用详解与差异分析

需积分: 10 6 下载量 43 浏览量 更新于2024-11-29 收藏 46KB PDF 举报
"const的所有用法——Dan+Saks.pdf" 在C++编程中,`const`关键字扮演着重要的角色,它用于声明常量和使变量不可修改。`const`的使用可以增强代码的清晰性和安全性。在给定的描述中,Phil Baurer遇到了一个与`const`和`typedef`结合使用时的问题,这个问题涉及到编译器如何处理常量数据的存储位置。本文将详细探讨`const`的各种用法,并解释Phil遇到的现象。 首先,`const`可以用来修饰变量,表示该变量一旦被初始化后就不能再改变。例如: ```cpp const int x = 5; // 声明一个整型常量x,值为5 ``` 在上述代码中,尝试修改`x`的值会导致编译错误。 接着,`const`可以用于指针,有两种主要形式:`const`指针和指针`const`。在Phil的问题中,`const void*`类型的指针表示它指向的数据是不可修改的,但指针本身可以改变指向。而`void* const`则意味着指针指向的地址是固定的,但指针可以指向不同的类型。 Phil的问题涉及`const`与数组和`typedef`的结合。`typedef`是一种创建别名的方式,使得代码更易读。考虑以下两个声明: 1. `typedef void* VP; const VP vectorTable[] = {...};` 2. `const void* vectorTable[] = {...};` 第一种声明定义了一个名为`VP`的类型别名,然后创建了一个`VP`类型的数组`vectorTable`,其中的元素被认为是常量。第二种声明直接创建了一个`const void*`类型的数组,其中的元素同样不可修改。 Phil注意到,编译器将第一种声明的`vectorTable`放在了`CONSTANT`段,而第二种声明的`vectorTable`放在了`DATA`段。这是由于`const`的规则导致的。在C++中,常量数据通常被放在程序的只读存储区(如`.constdata`或`.rodata`段),而非常量数据则放在可读写的数据段(如`.data`或`.bss`段)。 在Phil的案例中,编译器将`const VP vectorTable[]`视为非`const`的`void*`指针数组,因为`VP`的`const`性质被忽略了,因此`vectorTable`被放入`DATA`段。相反,`const void* vectorTable[]`明确地声明了数组元素是常量,所以被放入`CONSTANT`段。 这种行为符合C++标准,因为`const`修饰符在`typedef`之后时,它的作用仅限于类型定义,而在类型定义之后时,`const`应用于变量本身。Phil所遇到的情况并非编译器的错误,而是对`const`和`typedef`结合使用的理解偏差。 总结来说,`const`关键字在C++中有着丰富的用法,包括但不限于声明常量、修饰指针和数组。理解`const`的规则对于编写高效且安全的代码至关重要。在使用`typedef`时,尤其要注意`const`的位置,因为它可能影响到编译器如何处理变量的存储。在Phil的例子中,`const`的位置决定了数组在内存中的定位,这也是C++编译器对`const`进行内存管理的一个实例。

uni.request({ url: config.baseUrl + '/API/Task/getToken', method: 'GET', success(res) { that.baseUrl = res.data.domain that.token = res.data.token; // 获取到 token 后再进行上传 that.imgList.push(e.tempFilePaths[0]); const fileName = e.tempFilePaths[0].substr(e.tempFilePaths[0] .lastIndexOf('/') + 1); // 获取文件名 const fileExt = fileName.substr(fileName.lastIndexOf('.') + 1) .toLowerCase(); // 获取文件拓展名,并转换为小写 const today = new Date().toISOString().slice(0, 10); // 获取当天日期,格式为 yyyy-mm-dd const now = new Date(); const year = now.getFullYear(); const month = now.getMonth() + 1; const day = now.getDate(); const hour = now.getHours(); const minute = now.getMinutes(); const currentDateTime = ${year}-${month}-${day}-${hour}:${minute}:00; var nums = []; that.uploadCount++; // 上传次数加一 const newFileName = currentDateTime + '' + that.uploadCount + '.' + fileExt; // 生成新的文件名,以上传次数为前缀 const path = that.fromData.c_name + '/' + that.fromData.a_name + '/' + that.fromData.m_name + '/' + that.fromData.mold + '/' + that.fromData.m_title + '/' + that.fromData.r_name + '-' + that.uploadCount + '/' + that.fromData.o_name + '/' + today; const key = path + '/' + newFileName that.imgData.push(key) uni.uploadFile({ url: 'https://upload-z1.qiniup.com', filePath: e.tempFilePaths[0], name: 'file', formData: { token: res.data.token, key: path + '/' + newFileName // 将路径和文件名拼接起来 }, success(res) { const data = JSON.parse(res.data); const key = data.key const parts = key.split("."); const KeynewName = parts.slice(0, -1).join(".") + ".jpg"; that.baseList.push(that.baseUrl + KeynewName) that.Keyname.push(KeynewName) for (var i = 0; i < that.Keyname.length; i++) { var num = that.Keyname[i].split('/').slice(-1)[0].split('.')[0].split('')[1]; nums.push(num); } console.log('存在的文件名:'+nums) }, fail(erro) { console.log(erro); } }); }, fail(err) { console.log("获取 Token 失败:", err); } });我想让这里的uploadCount先判断nums中存在哪些,uploadCount只能为1,2,3 如果nums存在1,2那么uploadCount只能为3

2023-06-10 上传