IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 嵌套模板,友元函数与模板类 -> 正文阅读

[数据结构与算法]嵌套模板,友元函数与模板类

1、友元函数与模板类

常见类型

模板函数中,实现友元函数,大概有下面几种分类。

  • 不需要模板参数的非模板函数
  • 需要模板参数的非模板函数
  • 需要模板参数的模板函数,使用类的模板参数来特化
  • 需要模板参数的模板函数,使用自己的模板参数。(可以有多个模板参数)
template<typename T>
class A;

template<typename T>
void func3(const A<T>& obj);

template<typename T>
class A {
public:
	A(T data) : ma(data) {}

	friend void func1();
	friend void func2(const A<T>& obj) {
		cout << obj.ma << endl;
	}

	friend void func3<>(const A<T>& obj);

	template<typename U>
	friend void func4(const A<U>& obj);

private:
	T ma;
	static T num;
};
template<typename T>
T A<T>::num = 10.5;

void func1() {
	cout << A<int>::num << endl;
}

template<typename T>
void func3(const A<T>& obj) {
	cout << obj.ma << endl;
	cout << A<T>::num << endl;
}

template<typename U>
void func4(const A<U>& obj) {
	cout << obj.ma << endl;
}

几点说明

1、func2,在类内定义的话,会自动生成对应的函数。如果在类外定义的话,只能为每一种参数都特化一个函数。

void fun2(const A<int>& obj) {
    cout << obj.ma << endl;
}

void func2(const A<float>& obj) {
    cout << obj.ma << endl;
}
            .......

2、func3,在类外定义的话,不需要像func2一样,每种参数类型都特化一个函数。在类内定义的话,需要加上 关键字。注意func3这种类型,需要在提前声明。

template<typename T>
class A {
public:
            ....
	template<typename T>
	friend void func3<>(const A<T>& obj) {
		cout << obj.ma << endl;
	}
            ....
private:
	T ma;
	static T num;
};

3、func2 不需要模板参数推导,相比 func3 是更优的匹配,两者同名时会优先调用 func2。

4、func3 和 func4 的区别在于:func3 是模板类实例化一个参数后,func3也实例化一个。func4 所有类型的函数,都是模板一个实例化的友元。func3 属于一对一。func4 属于 多对一。

template <typename T>
void func3(const A<T> &a)
{
    cout << "f3: " << A<double>::num << endl;
}

template <typename U>
void func4(const A<U> &a)
{
    cout << "f4: " << A<double>::num << endl;
}

A<int> a(10);
func3(a);  会报错
func4(a);  可以调用。

func4 对于 A<int> 可以有多个实例,func3 只有 int。

?参考:? https://www.cnblogs.com/h-hg/p/8783935.html

2、模板类与模板类

1、模板类作为另一个模板类的成员变量。公用一个T

一般情况下,类去做成员变量的时候,都会以指针的形式去声明定义。同时,也不能忘记模板参数,或者直接实例化。

template<typename T>
class A {
public:
	A(T data) : ma(data) {}
	void print() {
		cout << ma << endl;
	}
private:
	T ma;
};

template<typename T>
class B {
public:
	B(T data) : mb(data) {
		pa = new A<T>(data);
	}
	void print() {
		pa->print();
	}
	~B() {
		delete pa;
	}
private:
	T mb;
	A<T>* pa;
};

int main()
{
	B<int> b(10);
	b.print();

	return 0;
}



###也可以这样写

template<typename T, typename Ac = A<T>>
class B {
public:
	B(T data) : mb(data) {
		pa = new Ac(data);
	}
	void print() {
		pa->print();
	}
	~B() {
		delete pa;
	}
private:
	T mb;
	Ac* pa;
};

2、C++类模板与继承

。。。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:47:47  更:2022-03-12 17:48:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:48:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码