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的更多相关文章

  1. C++知识点案例 笔记-5

    1.关系运算符重载 2.类型转换函数重载 3.转换构造函数 4.函数模板 5.显式实例化 6.类模板外定义模板函数 1.关系运算符重载 ==关系运算符重载== //直接(按分数)比较两个对象 #inc ...

  2. C++知识点案例 笔记-4

    1.纯虚函数 2.抽象类 3.内部类 4.运算符重载 5.类的函数重载 6.友元的函数重载 1.纯虚函数 ==纯虚函数== //有时基类中无法给出函数的具体体现,定义纯虚函数可以为派生函数保留一个函数 ...

  3. C++知识点案例 笔记-3

    1.基类指针等与派生类的兼容 2.构造函数 3.析构函数 4.虚基类 5.虚函数 6.虚析构函数 ==基类指针等与派生类的兼容== #include <iostream> #include ...

  4. C++知识点案例 笔记-2

    1.友元函数 2.友元类 3.继承(公有继承) 4.公有继承的访问权限 5.私有继承的访问权限 6.保护继承的访问权限(两次继承) ==友元函数== #include <iostream> ...

  5. C++知识点案例 笔记-1

    1.重载函数 2.内联函数 3.New.Delete 4.重载与.const形参 5.常数据成员 6.静态成员函数 ==重载函数== #include <iostream> using n ...

  6. Java后端高频知识点学习笔记1---Java基础

    Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...

  7. [置顶] 单片机C语言易错知识点经验笔记

    今天写这一篇文章并不是因为已经想好了一篇文章才写下来,而是我要将这一篇文章作为一个长期的笔记来写,我会一直更新.在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点 ...

  8. 面试总结:鹅厂Linux后台开发面试笔试C++知识点参考笔记

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 文章是由自己笔试面试腾讯的笔记整理而来,整理的时候又回顾了一遍,中间工 ...

  9. php 知识点 --个人笔记

    ##2015-09-06 为防止用户看到错误信息,而出现的不友好界面.故一般性会在php.ini里设置:display_errors = Off;不过在开发的时候,我们有时候需要打开错误信息.这时候, ...

随机推荐

  1. Windows上Docker Toolbox修改镜像源

    https://blog.csdn.net/weixin_36242811/article/details/90515835

  2. java面试-JVM内存结构

    一.JVM内存结构 二.类加载(classLoader)机制 java中的ClassLoader详解 java类加载机制面试题 java类加载机制面试题 虚拟机把描述类的数据从Class文件加载到内存 ...

  3. GAMES101作业2

    作业任务: 填写并调用函数 rasterize_triangle(const Triangle& t). 即实现光栅化 该函数的内部工作流程如下: 创建三角形的 2 维 bounding bo ...

  4. Sql Server存储过程和游标的配合操作

    本段代码主要为了记录存储过程以及游标的使用,防止以后自己忘记 知识点:1.存储过程书写 2.游标书写 3.游标循环更新记录 create proc saletargetas declare @ower ...

  5. JavaScript深入理解-PWA渐进式应用

    WPA-渐进式 web 应用 PWA 是什么 渐进式 Web 应用,提升 web app 浏览体验. manifest 应用程序清单 基本介绍: web app manifest是 PWA 技术集合中 ...

  6. CentOS 7.6部署Vue + SrpingBoot + MySQL单体项目

    对于独立的项目(前端.后台单体服务.数据库),部署到新服务器上时,常常需要繁琐的配置与环境安装,这里介绍Centos 7.6下如何搭建基于Docker的环境,以及如何使用docker部署一套Vue + ...

  7. Java刷题-tree

    一.分别按照二叉树先序,中序和后序打印所有的节点. 这道题就是书上的算法思想的实际使用,唯一需要特别注意到的是用递归的方式建树,还是比较巧妙的,因为一棵树的建立过程字符流是重复使用的,用递归的方式对根 ...

  8. “改造” VS Code 编辑器,一起写个插件吧!

    作者:HelloGitHub-小夏(首发于 HelloGitHub 公众号) 作为一个靠代码作为"生计"的开发者,bug 写的好不好,编辑器真的很重要!那么 Visual Stud ...

  9. 001 - 使用鸿蒙WebView创建简单浏览器 step 1

    打开官网,找到WebView的文档(模拟器不支持) 鸿蒙webview的开发指南(原始链接,方便大家识别并点击):https://developer.harmonyos.com/cn/docs/doc ...

  10. Windows Terminal 安装与配置

    1 安装 安装可以从应用商店安装(直接搜索即可)或者Github安装(可以戳这里): 下载msixbundle格式的文件即可直接打开安装. 2 配置前准备 2.1 下载字体 推荐使用FiraCode, ...