C++知识点案例 笔记-6
1.三种友元函数
-非模板友元函数
-约束模板友元函数
-非约束模板友元函数
2.非类型参数
3.模板特化
1.三种友元函数
=====三种友元函数=====
--1---非模板友元函数
#include<iostream>
using namespace std;
template<typename T>
class R
{
T lin_number;
static int count;
public:
R(const T& t) :lin_number(t){ count++; }
~R(){count--;}
friend void fun();//友元函数1
friend void show(const R<T>& a);//友元函数2
};
template<typename T>
//初始化count
int R<T>::count = 0;
//定义函数
void fun()
{
cout<< "int_count:" << R<int>::count << endl;
cout<< "double_count:" << R<double>::count <<endl;
}
void show(const R<int>& a)
{
cout<< "int_lin:" << a.lin_number <<endl;
}
void show(const R<double>& a)
{
cout<< "double_lin:" <<a.lin_number <<endl;
}
int main()
{
//调用函数1
fun();
//创建函数对象
R<int> a(20);
fun();
R<double> b(50.2020);
fun();
show(a);
show(b);
return 0;
}
---2--约束模板友元函数
#include<iostream>
using namespace std;
//函数模板声名
template<typename T>
void fun();
template<typename T>
void show(T& a);
//类模板定义
template<typename U>
class R
{
U lin_number;
static int count;
public:
R(const U& u) :lin_number(u){ count++; }
~R(){count--;}
friend void fun<U>();//友元函数1
friend void show<>(R<U>& a);//友元函数2
};
template<typename T>
int R<T>::count = 0;//初始化count
template<typename T>
void fun()
{
cout<< "tl_size:" << sizeof(R<T>) <<endl;
cout<< "tl_count:" << R<T>::count <<endl;
}
template<typename T>
void show(T& t)
{
cout<< "TL-lin_number:" << t.lin_number <<endl;
}
int main()
{
//调用int类型函数模板实例
fun<int>();
//创建函数对象 class R中对函数进行了限制(限制为U型)个人感觉约束之意就在此呀
R<int>a(10);
R<int>b(20);
R<double>c(5.2);
//调用show()输出类的数据成员信息
show(a);
show(b);
show(c);
fun<int>();
fun<double>();
return 0;
}
--3---非约束模板友元函数
#include<iostream>
using namespace std;
template<typename T>
class F
{
private:
T lin_number;
public:
F(const T& t):lin_number(t){};
//类内部声名函数模板
template<typename U,typename V>
friend void show(U& u,V& v);
};
template<typename U,typename V>
void show(U& u,V& v)
{
cout<< u.lin_number<< "==AND=="<< v.lin_number<<endl;
}
int main()
{
F<int>a(10);
F<int>b(20);
F<double>c(5.2);
show(a,b);
show(a,c);
return 0;
}
2.非类型参数
==非类型参数==
#include<iostream>
using namespace std;
template<typename T,unsigned size>
class Array
{
T arr[size];
public:
T& operator[] (unsigned i) //运算符重载
{
if (i >= size)
cout<<"Out of the bound !" <<endl;
else
return arr[i];
}
};
int main()
{
Array<char,6>arr01;//定义长度为6的char类型数组
Array<int,10>arr02;//定义长度为10的int类型数组
arr01[0] = 'A';
cout<< arr01[0] <<endl; //如果此处输入的 下标 > = 6 则输出 Out of the bound !
for(int j = 0;j < 10;j++)
{
arr02[j] = j;
}
for(int k = 0;k < 10;k++)
{
cout<< arr02[k] <<"_";
}
return 0;
}
3.模板特化
==模板特化==
#include<iostream>
#include<cstring>
using namespace std;
template<typename T>
//定义函数模板
bool is_equal(T m,T n)
{
return m == n;
}
//函数模板的特化
template<>
bool is_equal(char* t1,char* t2)
{
return strcmp(t1 , t2) == 0;
}
//类模板
template<typename T>
class Compare
{
public:
bool is_equal(T m,T n)
{
return m == n;
}
};
//类模板的特化
template<>
class Compare<char*>
{
public:
bool is_equal(char* t1,char* t2)
{
return strcmp(t1 , t2) == 0;
}
};
int main()
{
char str1 = 'jjf';
char str2 = 'zl';
cout<< "函数模板=AND=函数模板特化:" <<endl;
cout<< is_equal(1,3) <<endl;
cout<< is_equal(str1,str2) <<endl;
cout<< "类模板=AND=类模板特化:" <<endl;
Compare<int> c1;
Compare<char> c2;
cout<< c1.is_equal(1,1)<<endl;
cout<< c2.is_equal(str1,str2)<<endl;
return 0;
}
C++知识点案例 笔记-6的更多相关文章
- C++知识点案例 笔记-5
1.关系运算符重载 2.类型转换函数重载 3.转换构造函数 4.函数模板 5.显式实例化 6.类模板外定义模板函数 1.关系运算符重载 ==关系运算符重载== //直接(按分数)比较两个对象 #inc ...
- C++知识点案例 笔记-4
1.纯虚函数 2.抽象类 3.内部类 4.运算符重载 5.类的函数重载 6.友元的函数重载 1.纯虚函数 ==纯虚函数== //有时基类中无法给出函数的具体体现,定义纯虚函数可以为派生函数保留一个函数 ...
- C++知识点案例 笔记-3
1.基类指针等与派生类的兼容 2.构造函数 3.析构函数 4.虚基类 5.虚函数 6.虚析构函数 ==基类指针等与派生类的兼容== #include <iostream> #include ...
- C++知识点案例 笔记-2
1.友元函数 2.友元类 3.继承(公有继承) 4.公有继承的访问权限 5.私有继承的访问权限 6.保护继承的访问权限(两次继承) ==友元函数== #include <iostream> ...
- C++知识点案例 笔记-1
1.重载函数 2.内联函数 3.New.Delete 4.重载与.const形参 5.常数据成员 6.静态成员函数 ==重载函数== #include <iostream> using n ...
- Java后端高频知识点学习笔记1---Java基础
Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...
- [置顶] 单片机C语言易错知识点经验笔记
今天写这一篇文章并不是因为已经想好了一篇文章才写下来,而是我要将这一篇文章作为一个长期的笔记来写,我会一直更新.在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点 ...
- 面试总结:鹅厂Linux后台开发面试笔试C++知识点参考笔记
文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 文章是由自己笔试面试腾讯的笔记整理而来,整理的时候又回顾了一遍,中间工 ...
- php 知识点 --个人笔记
##2015-09-06 为防止用户看到错误信息,而出现的不友好界面.故一般性会在php.ini里设置:display_errors = Off;不过在开发的时候,我们有时候需要打开错误信息.这时候, ...
随机推荐
- 给我一个shell我能干翻你内网
0x00 前言 在去年小菜鸡学了点内网知识就闲着没事跑点jboss的站看看,在经历过很多次内网横向失败之后终于算是人生圆满了一把,阿三的站一般进去之后很难横向,不知道是不是我太菜的原因,反正阿三的站能 ...
- Java生鲜电商平台-API接口设计之token、timestamp、sign 具体设计与实现
转载:https://www.cnblogs.com/jurendage/p/12653865.html 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安 ...
- 软工个人阅读作业2 —— 构建之法与CI/CD
项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人阅读作业#2 我在这个课程的目标是 阅读思考教材,调研软工工具 这个作业在哪个具体方面帮助我实 ...
- Leedcode算法专题训练(数学)
204. 计数质数 难度简单523 统计所有小于非负整数 n 的质数的数量. class Solution { public int countPrimes(int n) { boolean[] is ...
- 【全网首发】鸿蒙开源三方组件--跨平台自适应布局yoga组件
目录: 1.介绍 2.如何使用 3.集成方式 4.附录1:FlexBox科普 5.附录2:相关资料 介绍 yoga是facebook打造的一个跨IOS.Android.Window平台在内的布局引擎, ...
- 【ShardingSphere】ShardingSphere学习(二)-核心概念-SQL
逻辑表 水平拆分的数据库(表)的相同逻辑和数据结构表的总称. 例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order. 真实表 在分片的数 ...
- Linux日志分析和管理
目录 日志的作用.分类.管理.轮转和级别 rsyslog服务 Journal守护进程 /var/log下相关的日志文件 日志服务器的建立 日志的作用.分类.管理.轮转和级别 日志的作用: 用于记录系统 ...
- TCP的三次握手和四次挥手和UDP协议
目录 TCP 三次握手 四次挥手 为什么建立连接是三次而断开连接是四次呢? TCP和UDP的区别 TCP数据包的封装 UDP数据包封装 SCTP SYN Flood泛洪攻击 TCP TCP(Trans ...
- Python脚本与Metasploit交互进行自动永恒之蓝攻击
我们首先利用 findTarget() 函数找到目标网段或目标主机中开放了445端口的主机,然后利用 confickerExploit() 函数将攻击代码写入 configure.rc 配置文件中,最 ...
- Win64 驱动内核编程-14.回调监控文件
回调监控文件 使用 ObRegisterCallbacks 实现保护进程,其实稍微 PATCH 下内核,这个函数还能实现文件操作监视.但可惜只能在 WIN7X64 上用.因为在 WIN7X64 上 P ...