18.2节练习

练习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 Exercise
	cout << "ivar = " << ivar << endl;
	++::ivar;	//ivar of mainp
	cout << "::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();     1
	void compute(const void *);     2
}
using primerLib::compute;  
void compute(int);      3
void compute(double, double = 3.4);    4
void compute(char*, char *= 0);       5
void f()
{
	compute(0);
}
候选函数和可行函数:2 3 4 5
最佳匹配:3

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值