轻松学 c++之类与对象下篇 + 模板
好久不见各位小伙伴们,那么先前是博主能力有限,加之c++在有些部分确实有些难,使得博主停止学习了一段时间,在这段时间里博主也去重新给自己梳理并总结了一下知识点,那么接下来将会以通俗易懂的方式给大家讲解。、
那么废话不多说,我们进入正题
类与对象下篇
运算符重载
关键字:operator
格式:operator 运算符(参数);
eg.operator + (参数);
多元运算符的简单讲解
。⼀元运算符有⼀个参数,⼆元 运算符有两个参数
注意:operator是默认成员函数,有一个隐藏的this指针,因此参数⽐运算对象少⼀个
不能重载的运算符:.* :: sizeof ?: .
赋值运算符
赋值运算符重载的特点
1. 赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成 const 当前类类型引⽤,否则会传值传参会有拷⻉
2. 有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋 值场景。
3. 没有显式实现时,编译器会⾃动⽣成⼀个默认赋值运算符重载,默认赋值运算符重载⾏为跟默认构 造函数类似,对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型 成员变量会调⽤他的拷⻉构造。
4. 像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成的赋值运算符重载就 可以完成需要的拷⻉,所以不需要我们显⽰实现赋值运算符重载。
总结:1.必须重载为成员函数,且建议用const当前类类型
2.有返回值,建议用引用
3.没有写时,会自动生成
初始化列表
格式:类型()
:属性
,属性
{#这里面可写可不写,小白阶段建议不写,易混淆#}
eg. Date()、
: _year(1900)
, _month(1)
, _day(1)
{}
注意:这里的初始化顺序是根据类中私有区的声明顺序来初始化的。
static成员
• ⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进⾏初始化。
• 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。
• ⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
• 静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针。
• ⾮静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
• 突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量 和静态成员函数
总结:1. 静态成员变量要在类外初始化
2.静态成员变量是所有类共享的,且存在静态区中(什么是静态区后面会讲)
3.静态成员函数没有指针
4.静态成员函数只能访问其他的静态成员变量和静态成员函数
模板篇
函数模板
这里我不想多提,基本上和c语言的函数比较相似,
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, a2);
Add(d1, d2);
return 0;
}
这里的话我还是建议大家看一下我的b站的视频,那里讲的比较详细
视频链接:【c++模板上】https://www.bilibili.com/video/BV1vZa2eaEKb?vd_source=9c17c862acda0523093f08ff7dd82439
类模板
template class Stack
{
public:
Stack(size_t capacity = 4)
{
_array = new T[capacity];
_capacity = capacity;
_size = 0;
}
void Push(const T& data);
private:
T* _array;
size_t _capacity;
size_t _size;
};
template <class T>
void Stack::Push(const T& data)
{
// 扩容
_array[_size] = data;
++_size;
}
int main()
{
Stack<int> st1;// int
Stack<double> st2; // double
return 0;
}
模板实例化
Stack<int> st1;//模板实例化
stack是类 stack<int>是类型
加餐部分
new
格式:类型 变量 = new 类型[ 空间大小 ]
作用:和malloc一样申请空间,但又比malloc高级,会自动初始化
eg.char tmp = new char[ capacity + 1 ]
delete
格式:delete[ ] 数组名;
作用:和free的作用一样都是用于释放空间,但需要手动置空
eg.delete[ ] arr;
那么今天的内容就先到这里了,我们下期见!!!