宁波IT培训
美国上市IT培训机构

0574-87236644

C++有哪些知识点?这里有一份串联总结(一)

  • 时间:2018-03-05 10:28
  • 发布:转载
  • 来源:网络

继C语言之后,C++也告一个段落了,不过,只是总要串起来才能更有效的掌握,那么现在就来再回顾一下C++的内容,并且将其串起来。


在学习C++之前,我们就用C语言实现了顺序表和链表,这是学习数据结构的基础,提前接触总是好的,在学习c++之后,我们又实现了了两次,分别是使用类实现、使用模板类实现。那么接下来我们就进入C++的第一个主题——类



说到类,我就不得不提结构体,当然不是C语言中的结构体,而是C++中的结构体,想想这两者之间的不同:C++中的结构体不仅仅可以存放数据,而且还可以存放函数,不过,我们通常喜欢使用另一个关键字——class

那么现在就再来回顾一下类的定义吧:

class ClassName
{
    //……

};


class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。类中的元素称为类的成员;类中的数据称为类的属性或者类的成员数据;类中的函数称为类的方法或者成员函数。


当时在总结类的时候总结了类的留个成员函数,那么我们再来回顾一下,它们分别是:

类的构造函数、析构函数、拷贝构造函数、赋值运算符 重载、取地址运算符重载、const修饰的取地址运算符重载。那么我们重点说一下前几个:


类的构造函数:是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内只且只调用一次,以保证每个数据成员都有一个合适的初始值。


构造函数的特性: 
1、函数名与类名相同。 
2、没有返回值。 
3、有初始化列表(可以不用)。 
4、新对象被创建,由编译器自动调用,且在对象的生命期内仅调用一次。 
5、构造函数可以重载,实参决定了调用那个构造函数。 
6、如果没有显式定义时,编译器会提供一个默认的构造函数。 
7、无参构造函数和带有缺省值得构造函数都认为是缺省构造函数,并且缺省构造函数只能有一个。


类的析构函数:与构造函数功能相反,在对象被销毁时,由编译器自动调用,完成类的一些资源清理和汕尾工作。


析构函数的特性: 
1、析构函数在类名(即构造函数名)加上字符~。 
2、析构函数无参数无返回值。 
3、一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。 
4、对象生命周期结束时,C++编译系统系统自动调用析构函数。 
5、注意析构函数体内并不是删除对象,而是做一些清理工作。


类的拷贝构造函数:只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用。


在这一个模块里有一个重要的地方,那就是浅拷贝问题,这个在之前也总结过,所以大致回顾一下:


浅拷贝的问题是怎样出现的?又怎么解决这个问题呢?


浅拷贝是经过拷贝之后,两个对象公用一个内存空间,导致释放对象的时候出现内存泄漏的问题。解决的方案有三个,分别是深拷贝的普通版本和简化版本还有写时拷贝。


深拷贝和写实拷贝的方法不同:深拷贝是再开辟一段空间放置拷贝的对象,这样从根本上解决问题,没有出现两个对象共用一块内存,就不会出现内存泄露的问题;而写拷贝是通过计数器的形式来将这块内存空间的使用对象个数写出来,这样释放的时候,通过判断计数器中的数字是不是0来决定是否释放空间。

内存管理

在C语言中申请空间是通过malloc、colloc、realloc在堆上申请的,释放空间是通过free。那么在C++中又有什么呢?


在C++中申请空间我们一般使用new,释放空间我们使用delete;如果要申请一组空间,我们使用new[],同样与之匹配的是delete[]。


重点:new和delete、new[]和delete[]一定匹配使用,否则可能出现内存泄露甚至崩溃的问题。


malloc/free和new/delete的区别:

它们都是动态管理内存的入口。
malloc/free是C/C++标准库的函数,new/delete是C++操作符。
malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员)。
malloc/free需要手动计算类型大小且返回值会void*,new/delete可自己计算类型的大小,返回对应类型的指针。

定位new表达式:定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。


继承


1、首先说一下什么是继承:继承是可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展和增进功能。这样产生的新类成为派生类。


2、那么接下来的重点就是继承体系中的基类和派生类了,这两者是继承关系,那么就有继承权限了,继承权限有三种,分别是:public、private、protected。其中public用的最多,在实际运用中使用的都是public。


3、我们在学习类的时候其实学了类的访问权限,也是三个:public、private、protected。在学习继承之前,后两者是没有什么区别的,但是,学习了继承之后,这两个就有区别了,可以说,protected就是为了继承体系而生的。那么我们来看一下他们的区别吧:

基类的private成员在派生类中是不能被访问的,如果基类的成员不想被类外直接访问,但需要在派生类中被访问,就定义protected。


4、然后再来说一下我们在基类和派生类中发现的一个现象,就是同名隐藏了,这和函数重载相似但是不同,首先一个重要的不同点就是作用域不同,同名隐藏发生在继承体系中,基类的一个成员函数和派生类的一个函数的名称相同,然后基类的成员函数在访问的时候就会被隐藏(只是藏起来了,并没有消失)。


既然同名隐藏(重定义)的两个函数的作用域不相同,那么显然就不会构成重载


5、之后就进入这一个模块的额重点了——对象模型

对象模型其实就是类的成员在内存的布局,想要了解继承到底是怎样进行的,首先就要知道各个成员在内存中是怎么分布的。


6、对了还有一点,就是友元关系可以继承吗?答案是否定的,因为友元函数不是类的成员函数。


7、上面的一些理论都是基于单继承说的,有单继承同样也有多继承,说到多继承就不得不再提对象模型了。涉及多继承那么显然继承的基类不止一个,那么,其内存空间又是怎样的布局呢?或者说,继承的先后顺序是什么。经实验验证,继承的顺序是按照写的先后顺序执行的。那么在空间里也就是这样分布的。


8、菱形继承:显而易见,是继承体系呈现的是菱形。

预约申请免费试听课

怕钱不够?就业挣钱后再付学费!    怕学不会?从入学起,达内定制课程!     担心就业?达内多家实践企业供你挑选!

上一篇:没有上一篇了
下一篇:C++有哪些知识点?这里有一份串联总结(二)

2020年Java程序员就业难吗?

Java工程师是干什么的?

Java工程师前途在哪里?

Java学到什么程度可以就业?

选择城市和中心
江西省

贵州省

广西省

海南省