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;不过在开发的时候,我们有时候需要打开错误信息.这时候, ...
随机推荐
- Windows上Docker Toolbox修改镜像源
https://blog.csdn.net/weixin_36242811/article/details/90515835
- java面试-JVM内存结构
一.JVM内存结构 二.类加载(classLoader)机制 java中的ClassLoader详解 java类加载机制面试题 java类加载机制面试题 虚拟机把描述类的数据从Class文件加载到内存 ...
- GAMES101作业2
作业任务: 填写并调用函数 rasterize_triangle(const Triangle& t). 即实现光栅化 该函数的内部工作流程如下: 创建三角形的 2 维 bounding bo ...
- Sql Server存储过程和游标的配合操作
本段代码主要为了记录存储过程以及游标的使用,防止以后自己忘记 知识点:1.存储过程书写 2.游标书写 3.游标循环更新记录 create proc saletargetas declare @ower ...
- JavaScript深入理解-PWA渐进式应用
WPA-渐进式 web 应用 PWA 是什么 渐进式 Web 应用,提升 web app 浏览体验. manifest 应用程序清单 基本介绍: web app manifest是 PWA 技术集合中 ...
- CentOS 7.6部署Vue + SrpingBoot + MySQL单体项目
对于独立的项目(前端.后台单体服务.数据库),部署到新服务器上时,常常需要繁琐的配置与环境安装,这里介绍Centos 7.6下如何搭建基于Docker的环境,以及如何使用docker部署一套Vue + ...
- Java刷题-tree
一.分别按照二叉树先序,中序和后序打印所有的节点. 这道题就是书上的算法思想的实际使用,唯一需要特别注意到的是用递归的方式建树,还是比较巧妙的,因为一棵树的建立过程字符流是重复使用的,用递归的方式对根 ...
- “改造” VS Code 编辑器,一起写个插件吧!
作者:HelloGitHub-小夏(首发于 HelloGitHub 公众号) 作为一个靠代码作为"生计"的开发者,bug 写的好不好,编辑器真的很重要!那么 Visual Stud ...
- 001 - 使用鸿蒙WebView创建简单浏览器 step 1
打开官网,找到WebView的文档(模拟器不支持) 鸿蒙webview的开发指南(原始链接,方便大家识别并点击):https://developer.harmonyos.com/cn/docs/doc ...
- Windows Terminal 安装与配置
1 安装 安装可以从应用商店安装(直接搜索即可)或者Github安装(可以戳这里): 下载msixbundle格式的文件即可直接打开安装. 2 配置前准备 2.1 下载字体 推荐使用FiraCode, ...