C++基础教程面向对象(学习笔记(72))

综合测验

模板允许我们使用占位符类型编写函数或类,以便我们可以使用不同的类型来模拟函数或类的相同版本。已实例化的函数或类称为函数或类实例。

所有模板函数或类必须以模板参数声明开头,该声明告诉编译器以下函数或类是模板函数或类。在模板参数声明中,指定了模板类型参数或表达式参数。模板类型参数只是占位符类型,通常名为T,T1,T2或其他单个字母名称(例如S)。表达式参数通常是整数类型,但可以是函数,类对象或成员函数的指针或引用。

拆分模板类定义和成员函数定义不像普通类那样工作 - 您不能将类定义放在.cpp文件中的头和成员函数定义中。通常最好将所有这些文件保存在头文件中,并在类下面使用成员函数定义。

当我们想要覆盖特定类型的模板化函数或类的默认行为时,可以使用模板特化。如果覆盖了所有类型,则称为完全特化。类还支持部分特化,其中只有一些模板化参数是专用的。从C ++ 14开始,函数不支持部分特化。

C ++标准库中的许多类都使用模板,包括std :: array和std :: vector。模板通常用于实现容器类,因此容器可以编写一次并与任何适当的类型一起使用。

Quiz Time:

1)定义成对传输的数据有时很有用。编写一个名为Pair1的模板化类,允许用户定义一个模板类型,该模板类型用于该对中的两个值。以下函数应该有效:

int main()
{
	Pair1<int> p1(5, 8);
	std::cout << "Pair: " << p1.first() << ' ' << p1.second() << '\n';
 
	const Pair1<double> p2(2.3, 4.5);
	std::cout << "Pair: " << p2.first() << ' ' << p2.second() << '\n';
 
	return 0;
}

并打印:

Pair: 5 8
Pair: 2.3 4.5
解决方案

#include <iostream>
 
template <class T>
class Pair1
{
private:
	T m_x;
	T m_y;
 
public:
	Pair1(const T& x, const T& y)
		: m_x(x), m_y(y)
	{
	}
 
	T& first() { return m_x;  }
	const T& first() const { return m_x; }
	T& second() { return m_y; }
	const T& second() const { return m_y; }
};
 
int main()
{
	Pair1<int> p1(5, 8);
	std::cout << "Pair: " << p1.first() << ' ' << p1.second() << '\n';
 
	const Pair1<double> p2(2.3, 4.5);
	std::cout << "Pair: " << p2.first() << ' ' << p2.second() << '\n';
 
	return 0;
}

2)编写一个Pair类,允许您为该对中的两个值中的每一个指定单独的类型。

注意:我们命名此类与前一个类不同,因为C ++目前不允许“重载”仅在模板参数的数量或类型方面不同的类。

以下程序应该有效:

int main()
{
	Pair<int, double> p1(5, 6.7);
	std::cout << "Pair: " << p1.first() << ' ' << p1.second() << '\n';
 
	const Pair<double, int> p2(2.3, 4);
	std::cout << "Pair: " << p2.first() << ' ' << p2.second() << '\n';
 
	return 0;
}

并打印:

Pair: 5 6.7
Pair: 2.3 4
提示:要使用两种不同的类型定义模板,请在模板参数声明中用逗号分隔这两种类型。有关更多信息,请参见第13.1课- 函数模板。

解决方案

#include <iostream>
 
template <class T, class S>
class Pair
{
private:
	T m_x;
	S m_y;
 
public:
	Pair(const T& x, const S& y)
		: m_x(x), m_y(y)
	{
	}
 
	T& first() { return m_x; }
	const T& first() const { return m_x; }
	S& second() { return m_y; }
	const S& second() const { return m_y; }
};
 
int main()
{
	Pair<int, double> p1(5, 6.7);
	std::cout << "Pair: " << p1.first() << ' ' << p1.second() << '\n';
 
	const Pair<double, int> p2(2.3, 4);
	std::cout << "Pair: " << p2.first() << ' ' << p2.second() << '\n';
 
	return 0;
}

3)字符串值对是一种特殊类型的对,其中第一个值始终是字符串类型,第二个值可以是任何类型。编写一个名为StringValuePair的模板类,它继承自部分专用的Pair类(使用std :: string作为第一种类型,并允许用户指定第二种类型)。

应运行以下程序:

int main()
{
	StringValuePair<int> svp("Hello", 5);
	std::cout << "Pair: " << svp.first() << ' ' << svp.second() << '\n';
 
	return 0;
}

并打印:

Pair: Hello5
提示:当您从StringValuePair构造函数中调用Pair构造函数时,请不要忘记将模板参数作为Pair类名称的一部分包含在内。

解决方案

#include <iostream>
#include <string>
 
template <class T, class S>
class Pair
{
private:
	T m_x;
	S m_y;
 
public:
	Pair(const T& x, const S& y)
		: m_x(x), m_y(y)
	{
	}
 
	T& first() { return m_x; }
	const T& first() const { return m_x; }
	S& second() { return m_y; }
	const S& second() const { return m_y; }
};
 
template <class S>
class StringValuePair : public Pair<std::string, S>
{
public:
	StringValuePair(const std::string& key, const S& value)
		: Pair<std::string, S>(key, value)
	{
	}
};
 
int main()
{
	StringValuePair<int> svp("Hello", 5);
	std::cout << "Pair: " << svp.first() << ' ' << svp.second() << '\n';
 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值