#粤嵌星计划,粤嵌我来了#
Week4-1
虚函数,虚表,纯虚函数,抽象类
(1).在对应的类成员方法加上关键字 virtual 即可称为虚函数
virtual void show()
{
cout << "student::show()"< }
虚函数的作用?
子类在继承于父类时,子类的虚函数会覆盖掉虚表里面的父类相当应的虚函数
注意:
·子类的虚函数与父类中相对应的虚函数具有相同的参数个数,类型.
·虚函数是一个非静态的成员函数 (static修饰为静态成员函数)
(2).虚表:
当一个类中有一个或多个虚拟函数那么这个类在创建对象的时候就会创建一个虚表。虚表就是一个存放虚函数指针的表格,而这个表格的首地址存放在对象的地址开始位置
注意:可以通过qt调试,查看到虚表里面的成员
(3).纯虚函数(非常重要,项目中都会遇到)
virtual void func() = 0; // 纯虚函数
抽象类:如果一个类里面存在有纯虚函数。
注意:抽象类是不能创建对象,需要被继承以后,需要把纯虚函数实现,才能创建对象
Week4-1
虚函数,虚表,纯虚函数,抽象类
(1).在对应的类成员方法加上关键字 virtual 即可称为虚函数
virtual void show()
{
cout << "student::show()"<
虚函数的作用?
子类在继承于父类时,子类的虚函数会覆盖掉虚表里面的父类相当应的虚函数
注意:
·子类的虚函数与父类中相对应的虚函数具有相同的参数个数,类型.
·虚函数是一个非静态的成员函数 (static修饰为静态成员函数)
(2).虚表:
当一个类中有一个或多个虚拟函数那么这个类在创建对象的时候就会创建一个虚表。虚表就是一个存放虚函数指针的表格,而这个表格的首地址存放在对象的地址开始位置
注意:可以通过qt调试,查看到虚表里面的成员
(3).纯虚函数(非常重要,项目中都会遇到)
virtual void func() = 0; // 纯虚函数
抽象类:如果一个类里面存在有纯虚函数。
注意:抽象类是不能创建对象,需要被继承以后,需要把纯虚函数实现,才能创建对象
#粤嵌星计划,粤嵌我来了#
第四周,第二次。
友元
1.概念:友元是c++独有特性,设置了友元函数或者友元类后,可以访问对应的私有或保护成员
2.友元特点:
1.优点:可以在对应友元后的函数中访问类里面的所有成员属性或成员方法(public,private,protect) 适当的提高了程序的运行效率
缺点:破坏类的封装性,违背面向对象思想
3.友元函数定义
friend 成员方法
friend void show();
4.友元函数使用
1.声明友元的接口,此接口可以放在类里面任意位置声明
2.友元函数类外实现
因为友元函数不属于类成员函数,所以不需要添加重属符(::),可以访问类的所有成员
void show()
{
Data d(10);
cout << d.age < d.print();
} https://t.cn/RuQ52aU
第四周,第二次。
友元
1.概念:友元是c++独有特性,设置了友元函数或者友元类后,可以访问对应的私有或保护成员
2.友元特点:
1.优点:可以在对应友元后的函数中访问类里面的所有成员属性或成员方法(public,private,protect) 适当的提高了程序的运行效率
缺点:破坏类的封装性,违背面向对象思想
3.友元函数定义
friend 成员方法
friend void show();
4.友元函数使用
1.声明友元的接口,此接口可以放在类里面任意位置声明
2.友元函数类外实现
因为友元函数不属于类成员函数,所以不需要添加重属符(::),可以访问类的所有成员
void show()
{
Data d(10);
cout << d.age <
} https://t.cn/RuQ52aU
#粤嵌星计划
第8周第一次
一、函数模板与普通函数的区别?
1)普通函数调用时可以发生自动类型转换。(隐式类型转换)
2)函数模板调用时,如果利用自动类型推导,不可以发生隐式类型转换。
3)如果利用显示指定类型方式,可以发生隐式类型转换的。
#include
using namespace std;
//普通函数与函数模板区别
//普通函数
int myAdd01(int a,int b)
{
return a + b;
}
//函数模板
template
T myAdd02(T a,T b)
{
return a + b;
}
int main(int argc,char *argv[])
{
int a = 10;
int b = 20;
char c = 'c'; //a->97 c->99
//1. 普通函数调用时可以发生自动类型转换。(隐式类型转换)
//cout << myAdd01(a,b) << endl;
//cout << myAdd01(a,c) << endl; //将c变成ascii码来计算,因此它知道10+c -> 10+99=109
//2. 函数模板调用时,如果利用自动类型推导,不可以发生隐式类型转换。
//cout << myAdd02(a,b) << endl;
//cout << myAdd02(a,c) << endl;
//3. 如果利用显示指定类型方式,可以发生隐式类型转换的。
cout << myAdd02(a,c) << endl; //非常明确告诉你,T就是int,所以c会转换成99
return 0;
}
总结:建议使用显示指定类型方式去调用函数模板,因为可以自己确定通用类型T
第8周第一次
一、函数模板与普通函数的区别?
1)普通函数调用时可以发生自动类型转换。(隐式类型转换)
2)函数模板调用时,如果利用自动类型推导,不可以发生隐式类型转换。
3)如果利用显示指定类型方式,可以发生隐式类型转换的。
#include
using namespace std;
//普通函数与函数模板区别
//普通函数
int myAdd01(int a,int b)
{
return a + b;
}
//函数模板
template
T myAdd02(T a,T b)
{
return a + b;
}
int main(int argc,char *argv[])
{
int a = 10;
int b = 20;
char c = 'c'; //a->97 c->99
//1. 普通函数调用时可以发生自动类型转换。(隐式类型转换)
//cout << myAdd01(a,b) << endl;
//cout << myAdd01(a,c) << endl; //将c变成ascii码来计算,因此它知道10+c -> 10+99=109
//2. 函数模板调用时,如果利用自动类型推导,不可以发生隐式类型转换。
//cout << myAdd02(a,b) << endl;
//cout << myAdd02(a,c) << endl;
//3. 如果利用显示指定类型方式,可以发生隐式类型转换的。
cout << myAdd02
return 0;
}
总结:建议使用显示指定类型方式去调用函数模板,因为可以自己确定通用类型T
✋热门推荐