18.2节练习

来源:互联网 发布:淘宝全球购有没有假货 编辑:程序博客网 时间:2024/06/05 16:30

练习18.12 //。。。


练习18.13 什么时候应该使用未命名的命名空间?

在某个给定的文件内使用,但是不跨越多个文件。


练习18.14 假设下面的operator*声明的是嵌套的命名空间mathLib::MatrixLib的一个成员:

namespace mathLib {namespace MatrixLib {class matrix{};matrix operator*(const matrix&, const matrix&);//...}}
请问你应该如何在全局作用域中声明该运算符。

mathLib::MatrixLib::matrix mathLIb::MatrixLib::operator*(const matrix&, const matrix&);


练习18.15 说明using指示和using声明的区别。

一条using声明语句一次只引入命名空间的一个成员。

using指示使得某个特定的命名空间中所有的名字都可见,这样我们就无须再为它们添加任何前缀限定符,可不能出现在类的作用域中。


练习18.16 && 18.17假定在下面的代码中标记为“位置1”的地方是对于命名空间Exercise中所有成员的using声明,请解释代码的含义。如果这些using声明出现在“位置2”又会怎样呢?将using声明编程using指示,重新回答之前的问题。并检验你的回答。

#include <iostream>using namespace std;namespace Exercise {int ivar = 0;double dvar = 0.0;const int limit = 1000;}int ivar = 0;//using Exercise::ivar; // 重复声明了ivar,编译不通过。 using Exercise::dvar;using Exercise::limit;void mainp(){double dvar = 3.14146;cout << "dvar = " << dvar << endl;int iobj = limit + 1;cout << "iobj = " << iobj << endl;++ivar;cout << "ivar = " << ivar << endl;++::ivar;cout << "::ivar = " << ::ivar << endl;}int main(){mainp();}

#include <iostream>using namespace std;namespace Exercise {int ivar = 7;double dvar = 0.0;const int limit = 1000;}int ivar = 0;void mainp(){using Exercise::ivar;//using Exercise::dvar;//重复声明using Exercise::limit;double dvar = 3.14146;cout << "dvar = " << dvar << endl;int iobj = limit + 1;cout << "iobj = " << iobj << endl;++ivar;//ivar of Exercisecout << "ivar = " << ivar << endl;++::ivar;//ivar of mainpcout << "::ivar = " << ::ivar << endl;}int main(){mainp();}

#include <iostream>using namespace std;namespace Exercise {int ivar = 0;double dvar = 0.0;const int limit = 1000;}int ivar = 0;using namespace Exercise;//错误和“位置1”的using声明是一样的,ivar不明确。void mainp(){double dvar = 3.14146;cout << "dvar = " << dvar << endl;int iobj = limit + 1;cout << "iobj = " << iobj << endl;++ivar;cout << "ivar = " << ivar << endl;++::ivar;cout << "::ivar = " << ::ivar << endl;}int main(){mainp();}

练习18.18 已知有下面的swap的典型定义(13.3节,第457页),当mem1是一个string时程序使用swap的哪个版本?如果mem1是int呢?说明在这两种情况下的查找过程。

void swap(T v1, T v2){using std::swap;swap(v1.mem1, v2.mem1);//交换类型T的其他成员}
string的情况:
std::swap — 使用string类的swap

int的情况:

std::swap — 使用实例化int类的swap


练习18.19 如果对swap的调用形如std::swap(v1.mem1, v2.mem1)将发生什么情况?

swap函数限定是string类中的版本。int类型的也能实例化。


练习18.20 在下面的代码中,确定哪个函数与compute调用匹配。列出所有候选函数和可行函数,对于每个可行函数的实参与形参匹配过程来说,发生了哪种类型转换?

namespace primerLib {void compute();     1void compute(const void *);     2}using primerLib::compute;  void compute(int);      3void compute(double, double = 3.4);    4void compute(char*, char *= 0);       5void f(){compute(0);}
候选函数和可行函数:2 3 4 5
最佳匹配:3

如果将using声明置于f函数中compute的调用点之前将发生什么情况?重新回答之前的那些问题。

候选函数和可行函数:3 4 5 对于f(),2不可见
最佳匹配:3


0 0