1.非类型模板参数 2.模板的特化 3.继承讲解

本文详细介绍了C++中的非类型模板参数、模板特化以及继承的相关概念。在非类型模板参数中,通过实例展示了如何使用常量作为模板参数。接着,讨论了模板特化,包括全特化和偏特化,并给出了示例。在继承部分,文章探讨了继承的四种关系,基类和派生类对象的赋值转换,以及继承中的作用域和派生类的默认成员函数。特别强调了在菱形继承中,虚拟继承如何解决数据冗余问题。
摘要由CSDN通过智能技术生成

1.非类型模板参数

模板参数分类类型形参与非类型形参。
类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。

#include<iostream>
using namespace std;

#define n=100;

template<class T>
class stack
{
   
private:
	T _a[n];
	int _top;
};


int main()
{
   
	stack<int> st1;//100
	stack<double> st2;//500
	return 0;
}

看到上面代码我想要开栈开int开100,double开500,但是不行啊,n被定义成了100做不到啊
但是我们我们可以这样,在模板里面加个参数,到时实例化的时候就是为是我们想开的大小,而这个n就是非类型模板参数

#include<iostream>
using namespace std;


template<class T,size_t n>
class stack
{
   
private:
	T _a[n];
	int _top;
};


int main()
{
   
	stack<int,100> st1;//100
	stack<double,500> st2;//500
	return 0;
}

而这个n上面我也讲了是常量,不能更改
验证
可以以看到st1和st2,里面的100和500没被引用
在这里插入图片描述
有些类型是不能当非类型模板参数的string和double都不能当,能当的大部分都是整型,char也能当
在这里插入图片描述

2.模板的特化

看我们下面前面二个打印没错,但是为什么第三个就有问题了,7月16怎么可能小于7月15
在这里插入图片描述
这个错误其实很简单,他们只是比较了地址了而已,要是我们要求这里不能用来解引用p1和*p2怎么解决
我们来解决这个问题可以用模板的特化来解决
函数模板的特化步骤:

  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。
 //针对某些类型要特殊化处理
template<>
bool Less<Date*>(Date* left, Date* right)
{
   
	return *left < *right;
}

在这里插入图片描述
前二个调用的都是正常模板,而第三个我们调用的是特化模板,不过除了这种办法,也可以专门写一个在这个函数的重载来解决
对于模板特化,函数模板可以避免,但是类模板不行,
比如我们要一个类模板,一边是int,另一边是double的参数类模板就只能使用特化了
在这里插入图片描述
上面图片写的是全特化,除了全特化,还有半特化和偏特化,有点像半缺省
在这里插入图片描述

偏特化
下面的意思是只要是指针就会匹配,如果只有int*,int就走原生版本,必须要求二个指针,要不然就不访问,除了指针,其实还有引用
在这里插入图片描述

3.继承

比如要你写个图书管管理系统,你会发现很多角色有的信息是相同的,比如每个人都有年龄,学生都有学号,地址等等
这个时候我们就可以用继承来解决,设计一个公共的类,再搞一个私类,把公共的类继承到私类里面
继承格式
在这里插入图片描述

1继承的关系

在这里插入图片描述
总结

  1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
  2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
  3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected> private。
  4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。
  5. 在实际运用中一般使用都是public继承,几乎很少使protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值