C++类模板与友元函数

这篇博客探讨了如何在C++中使用类模板和友元函数来实现特定功能。首先展示了如何定义一个普通全局函数作为类模板的友元,用于实现两个模板类对象的相加操作。接着,通过重载左移运算符(<<),创建一个友元函数以便直接输出类模板实例,简化了对象的显示。示例代码清晰地展示了这两种友元函数的应用及其在C++程序设计中的作用。
摘要由CSDN通过智能技术生成

目录

1.普通全局函数做类模板的友元函数

2.运算符重载做类模板的友元函数


1.普通全局函数做类模板的友元函数

需求:现有demo类模板,要求使用自定义addFun函数,实现对两个demo对象的相加

demo.h

#pragma once
#include<ostream>
#include<iostream>
using namespace std;


template <typename T>
class A{
public:
	A(T t = 0);
	T getT();

	template<typename T>
	friend A<T> addFun( const A<T> a1,  const A <T>a2);

private:
	T t;
};

template<typename T>
A<T>::A(T t) {
	this->t = t;
}

template<typename T>
T A<T>::getT() {
	return t;
}

类内部声明友元函数,必须写成以下形式:

template<typename T>

friend A<T> addFun (A<T> &a, A<T> &b);

main.cpp

#include<sstream>
#include"A.h"


template<typename T>
A<T> addFun( const A<T> a1,const A<T> a2) {
	T temp =A<T>( a1.t * 2 + a2.t * 3);
	return A<T>(T);
}



int main() {
	 A<int> a1(111), a2(222);
	 A<int> temp= addFun<int>(a1,a2);
	 cout << temp.getT() << endl;
	 system("pause");
	 return 0;
}

运行结果:

2.运算符重载做类模板的友元函数

需求:通过左移(<<)运算符号直接输出demo类模板。

demo.h

#pragma once
#include<ostream>
#include<iostream>
using namespace std;


template <typename T>
class A{
public:
	A(T t = 0);
	T getT();

	template<typename T>
	//注意在参数列表前要加 “<>”
	friend std::ostream& operator << <>(std::ostream& os, const A<T> a);
    //重载加号运算符
	A operator+(const A a2);
private:
	T t;
};


template<typename T>
A<T>::A(T t) {
	this->t = t;
}

template<typename T>
T A<T>::getT() {
	return t;
}

template<typename T>
A<T> A<T>::operator+(const A<T> a2) {
	A<T> temp = A<T>(this->t + a2.t);
	return A<T>(temp.t);
}

关于重载运算符作类模板友元函数,在参数列表前加“<>” :

一是,表明此友元函数是函数模板;

二是,此模板使用的模板类型参数为当前模板类的类型参数class

 main.cpp

#include<sstream>
#include"A.h"

template<typename T>
std::ostream& operator << (std::ostream & os, const A<T> a) {
	stringstream s;
	s << "总和为:" << a.t ;
	cout << s.str();
	return os;
}



int main() {
	 A<int> a1(111), a2(222);
	 A<int> temp= a1+a2;
	 std::cout << temp.getT() << std::endl;

	 system("pause");
	 return 0;
}

运行结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值