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. 奇异值分解(SVD)与主成分分析(PCA)

    本文中的内容来自我的笔记.撰写过程中,参考了书籍<统计学习方法(第2版)>和一些网络资料. 第一部分复习一些前置知识,第二部分介绍奇异值分解(SVD),第三部分介绍主成分分析(PCA).以 ...

  2. 《Effective C++》部分内容学习笔记整理

    简介 此笔记为<Effective C++>中部分内容的学习笔记. 目录 文档:<Effective C++>

  3. Google字体API使用简单示例

    一.前面的话 Google总会做些造福大众的事情,例如提供了web在线字体的API,这玩意其实去年就有了,但是字体种类手指头+脚趾头就可以数出来.but 最近,貌似Google对字体API进行了升级, ...

  4. Laravel 队列功能 简单应用

    生成任务类 默认情况下,应用程序的所有可排队任务都存储在 app/Jobs 目录下.如果 app/Jobs 目录不存在,则会在运行 make:job Artisan 命令时将创建它.你可以使用 Art ...

  5. kali 中文乱码解决

    在命令行输入"dpkg-reconfigure locales".进入图形化界面之后,(空格是选择,Tab是切换,*是选中),选中en_US.UTF-8和zh_CN.UTF-8,确 ...

  6. hdu4791水题

    题意:       打印东西,给你区间和每个区间的价格,然后输入任务张数,输出最少花费..    题解:       昨晚的小测试就有这个题目,当时蒙B了,怎么也读不懂题目,一直纠结怎么把150拆成1 ...

  7. UVA10382喷水装置

    题意:       给你一个矩形的空地,然后有一些圆形的喷水装置,每个装置的圆心都在矩形宽的中间位置,然偶给你每个矩形的圆心位置和半径,问你最少多少个喷水装置可以把矩形的所有编辑都覆盖上. 思路:   ...

  8. Python第一章-基础知识

    第一章:基础知识 1.1 安装python.     直接官网下载最新的python然后默认安装就可以了,然后开始菜单里找到pyhton *.*.* Shell.exe运行python的交互shell ...

  9. Java Web中间件

    目录 中间件 常见的web中间件有哪些 Tomcat Weblogic Jboss Jetty Webshere Glasshfish 中间件 我们经常会看到中间件,但是,一直好奇的是,中间件到底是什 ...

  10. POJ1456贪心(set或者并查集区间合并)

    题意:       给你n商品,每个商品有自己的价值还有保质期,一天最多只能卖出去一个商品,问最大收益是多少? 思路:       比较好想的贪心,思路是这样,每一次我们肯定拿价值最大的,至于在那天拿 ...