关于namespace的部分补充

上次写了一点关于namespace的部分内容,这里再做出一点补充。

上次讲到了namespace的一般用法,就是简单的一般命名空间使用,这里就补充其他两种特殊的,分别是全局命名空间和匿名命名空间。

全局命名空间是默认的命名空间,在显示声明的命名空间之外的声明就是默认在全局命名空间中,如全局变量,全局函数。

匿名命名空间就是使用namespace建立命名空间时没有加上名字的命名空间,如namespace{},这个命名空间就是一个匿名的命名空间,这其中的所有成员相当于静态成员,也就是static声明的,只能被本源文件访问。C++现在大多提倡用匿名命名空间取代static的用法。

需要注意的是匿名命名空间最好不要写在头文件中

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,接下来我会逐行解释这段代码的具体实现: ```c++ using namespace std; // 将十进制数转换为二十八进制 list<char> DecTo2816(double d, unsigned r) { stack<char> intPart; // 存储整数部分的转换结果 queue<char> fraPart; // 存储小数部分的转换结果 list<char> result; // 存储总的转换结果 int intp = (int)d; double frap = d - intp; // intp-整数值,frap-小数值 int res; // 表示余数或某数值的整数部分 while (intp) { // 转换整数部分:将余数转换为字符存入 stack<char> intPart res = intp % r; // 取余,若余数<=9则存入对应数字字符,否则存入’A’及以后字母 if (res <= 9) { intPart.push(res + '0'); } else { intPart.push(res - 10 + 'A'); } intp /= r; // 除以进制数 } while (!intPart.empty()) { // 将 stack<char> intPart 数据存入到 list<char> result result.push_back(intPart.top()); intPart.pop(); } if (frap == 0) { return result; // 如果 d 不包含小数部分则无须继续转换 } // 以下为转换小数部分,转换结果放入 queue<char> fraPart result.push_back('.'); for (int k = 1; k <= 5; k++) { // 转换结果最多保留到小数点后面 5 位 frap = frap * r; res = (int)frap; // 小数部分乘 r 取整 if (res <= 9) { fraPart.push(res + '0'); } else { fraPart.push(res - 10 + 'A'); } frap -= res; // 取小数部分 } while (!fraPart.empty()) { // 将小数部分的转换结果存入 list<char> result result.push_back(fraPart.front()); fraPart.pop(); } return result; } // 用于输出数据的函数模板 template<class T> void Print(T &t) { cout << t; } // 用于输出 list 的函数模板 template<class T> void ShowList(list<T> &l) { for_each(begin(l), end(l), Print<T>); cout << endl; } int main() { list<char> r = DecTo2816(1000.789, 16); // 将 1000.789 转换为十六进制的结果 ShowList(r); // 输出结果 return 0; } ``` 首先,代码使用了 `using namespace std;`,表示使用 `std` 命名空间中的所有成员。 接下来是 `DecTo2816` 函数,用于将十进制数转换为二十八进制。函数的参数包括一个双精度浮点数 `d` 和一个无符号整数 `r`,表示要将 `d` 转换为 `r` 进制数。函数的返回值是一个 `list<char>` 类型的容器,存储着转换结果。 函数首先定义了三个容器:`stack<char> intPart` 用于存储整数部分的转换结果,`queue<char> fraPart` 用于存储小数部分的转换结果,`list<char> result` 用于存储总的转换结果。 之后,函数将 `d` 分为整数部分和小数部分,分别存储在 `intp` 和 `frap` 中。接着,函数使用循环将整数部分转换成 `r` 进制数,将余数存储在 `stack<char> intPart` 中。在转换过程中,如果余数小于等于 9,则将其转换为对应的数字字符存储,否则将其转换为 A 及其以后的字母。转换完成后,再将 `stack<char> intPart` 中的数据存储到 `list<char> result` 中。 如果 `d` 不包含小数部分,则直接返回 `list<char> result`。否则,函数继续将小数部分转换为 `r` 进制数,转换结果存储在 `queue<char> fraPart` 中。转换过程中,函数使用循环将小数部分乘以 `r`,然后将乘积的整数部分存储在 `queue<char> fraPart` 中。同样的,如果整数部分小于等于 9,则将其转换为对应的数字字符存储,否则将其转换为 A 及其以后的字母。转换完成后,再将 `queue<char> fraPart` 中的数据存储到 `list<char> result` 中。 最后,函数返回 `list<char> result`。 接下来是两个函数模板:`Print` 和 `ShowList`。`Print` 用于输出数据,`ShowList` 用于输出 `list` 容器中的数据。这里使用了 `for_each` 算法和函数指针,对容器中的每个元素依次调用 `Print` 函数输出。 在 `main` 函数中,我们调用 `DecTo2816` 函数将 1000.789 转换为十六进制的结果,然后调用 `ShowList` 函数输出结果。 以上就是这段代码的具体实现,希望能够对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值