本篇文章为本人学习C++过程中记录的学习笔记,看的是哔站黑马程序员的视频,本人觉得讲的非常棒,感兴趣的可以看看,以下内容欢迎大家阅读和批评指正。
1、指针系列:
(1)① 常量指针 :const int *P; (const修饰指针)
特点:指针的指向可以更改,但是指向的值不可以更改。
② 指针常量 :int * const P; (const修饰常量)
特点:指针的指向不可以更改,但是指向的值可以更改。
③ const既修饰指针,又修饰常量的: const int * const p;
特点:指向的值都不能发生改变。
(2) this指针 :本质是指针常量。
2、 静态成员 :
(1)静态成员变量 :所有对象共享这一样的数据、类内声明,类外初始化;
(2)静态成员函数 :所有对象共享一个函数、静态成员函数只能访问静态成员变量。
3、多态:
看如下代码:
#include
using namespace std;
class Father
{
public:
void func()
{
cout << "调用父类成员func()函数成功!" << endl;
}
};
class Son:public Father
{
public:
void func()
{
cout << "调用子类成员func()函数成功!" << endl;
}
};
void test(Father& f)
{
f.func();
}
int main()
{
Son s1;
test(s1);
}
这个程序的执行结果是:调用父类成员func()函数成功!
为了能够输出“调用子类成员func()函数成功! ”,解决办法就是用虚函数,在父类Father的func函数前加个virtual。
得注意以下几点:①如果是这样test(Father* f),指针和引用是一样的; ②发生这种动态多态,必须得有继承关系; ③子类重写父类的虚函数,子类加不加virtual都可以( 一般不加,好区分 )。
(1) 纯虚函数与抽象类 :
class Father
{
Public: virtual void func() = 0;
};
上述代码中,函数func直接=0,表示纯虚函数,含有纯虚函数的类教抽象类。 其派生类必须对函数func进行重写实例化,不然也是抽象类。 也就是说,Father s; 编译会报错。
和虚函数差不多,一般写成纯虚函数的都是为了不让其代码实现,而是让子类实现。
(4) 虚析构和纯虚析构 :(解决的同一个问题,方法不同)
多态在使用的时候,如果子类中有属性开辟到了堆区,那么父类指针在释放空间时无法调用到子类的析构代码,应该如何解决?
注:父类的指针在析构的时候,不会调用子类的析构函数。 导致,如果有子类堆区属性,会出现内存泄漏,也就是delete不了。
解决方法:在父类的析构函数前加上virtual关键字即可。
如果采用的是纯虚析构的话,virtual ~Father()=0;但是,还得在类外初始化一下才行。 Father::~Father(){}
注:有了纯虚析构的类也是抽象类,无法实例化对象。
(5) 多态性:同一个操作可以是不同对象的行为 ;
-
函数
+关注
关注
3文章
4331浏览量
62618 -
指针
+关注
关注
1文章
480浏览量
70563 -
C++
+关注
关注
22文章
2108浏览量
73651 -
代码
+关注
关注
30文章
4788浏览量
68613 -
编译
+关注
关注
0文章
657浏览量
32871
发布评论请先 登录
相关推荐
评论