北京大学《程序设计实习》C++模板与友员类解析

需积分: 10 2 下载量 6 浏览量 更新于2024-08-01 收藏 139KB PPT 举报
"北京大学数字媒体实验室的CPP程序设计教材,涵盖了C++编程实践,特别是关于标准模板库(STL)的内容,由教师田永鸿讲解。教材中包含课堂问题,旨在帮助学生理解和掌握C++模板和友元类等核心概念。" 在C++编程中,模板是一种强大的工具,它允许程序员创建泛型函数和类,能够处理不同类型的数据。在《程序设计实习》课程中,田永鸿教授探讨了模板类和友元类的概念,这是理解C++高级特性的关键。 首先,课程中提到的问题1涉及到模板类的友元函数。友元函数不是类的成员,但可以访问类的私有和保护成员。在这个例子中,`myClass<T>::func()`被声明为`CTemp<T, int size>`的友元,这意味着`func`可以访问`CTemp`对象的私有成员`elements`。然而,`myClass`的实例化`myClass<int>`并不自动成为`CTemp`的友元,因为友元关系不是传递的。因此,这个代码片段可能存在错误,需要修正以确保`myClass<int>`是`CTemp<T, int size>`的友元。 问题2展示了如何通过模板参数化创建类模板的友元。在这里,`myClassA<T1>`和`myClassB<T2>`被声明为`CTemp<T1, T2, int size>`的友元。这意味着对于任何类型`T1`和`T2`,`myClassA<T1>`和`myClassB<T2>`都能够访问`CTemp`的私有成员。所以,`myClassA<int>`,`myClassB<double>`,`myClassA<double>`和`myClassA<char>`都是`CTemp<int, double, 50>`的友元类,可以与之交互。 问题3则提到了模板类的构造函数和友元函数`func(int)`。`CTemp<T, int size>`类的构造函数接受一个类型`T`的参数`Targ`。然而,`func(int)`创建了`CTemp`的实例,其中`size`参数固定为50,而`T`类型分别为`int`和`double`。这里的问题在于,`a(10)`和`b(8.9)`的调用方式看起来像是在尝试使用这些值来初始化`size`,但实际上它们应该是用来初始化`T elements[size]`数组的。这可能导致编译错误,因为`a(10)`期望的是一个`int`,而`b(8.9)`期望的是一个`double`,而不是整数大小。 这本教材通过实例深入浅出地解释了C++中的模板类、友元和构造函数等核心概念,对于学习C++编程的初学者和进阶者都极具价值。通过解决这些问题,学生可以更好地理解C++的模板机制,这对于编写高效、灵活的代码至关重要。