C++学习(26)

1. 何为多态?多态的本质是:一个程序中同名的不同方法。在面向对象的程序设计中,多态主要有以下三种方式来实现。

1)、通过子类对父类方法的覆盖来实现多态。

2)、通过一个类中方法的重载来实现多态。

3)、通过将子类的对象作为父类的对象实现多态。

 

类的复用有两种方式:组成(has-a)继承(is-a)

1组成就是在新的类中直接创建旧类的对象,这里我们复用的只是代码的功能而不是它的形式。

2继承是在原有的类的基础上建立一个新类,新类具有旧类的形式,但也加入了一些新的特性。

 

继承:指一个新的类继承原有类的基本特性,并增加了新的特性。(Java不允许多继承,而C++可以)

 

多态性允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

1)多态存在的三个必要条件

①要有继承 ②要有重写③父类引用指向子类对象(向上转型)

2)实现多态性的三种形式

①方法的重载 ②通过继承机制而产生方法覆盖 ③通过接口实现方法覆盖

3)多态的分类

多态分为编译时多态运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编译之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们平常所说的多态性。

 

补充:对于重载函数的描述,

重载的概念是:
方法名称相同,参数个数、次序、类型不同
因此重载对返回值没有要求,可以相同,也可以不同
但是如果参数的个数、类型、次序都相同,方法名也相同,仅返回值不同,则无法构成重载。

 

2.C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该:将析构函数设为私有。

分析:[编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。因此,将析构函数设为私有,类对象就无法建立在栈(静态)上了,只能在堆上(动态new)分配类对象]

 

3栈区效率比堆区高malloc分配的空间在堆区,临时变量分配在栈区。两者区别是:栈区由电脑自己清除(用完自动删),堆区需要程序员清除,或者程序结束后由系统清除

栈一般能放2M大小

使用动态内存分配,使用完,未删除就会造成泄漏。或者是如果没有任何一个指针指向那块动态内存,那它就泄漏了。

堆区和栈区都不会自动初始化,自动初始化会在未赋值的静态/全局区。(只有全局变量或者静态变量才会初始化为0,其它的情况,变量如果不初始化,值是未知的。)

 

4. 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。深拷贝不仅对指针进行拷贝,而且还对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。对含有静态成员数据的对象,静态成员属于类,被所有对象共享,所有深拷贝也不会拷贝这一份数据。只会拷贝非静态成员数据。


浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。

 

成员数据分为静态成员和非静态成员。深拷贝只拷贝非静态成员数据。

类的静态成员是所有类的实例所共有的,存储在全局(静态)区,只此一份,不管继承、实例化还是拷贝都是一份。

 

5.全局变量时初始化为0,局部变量初始化为随机值。

如果函数外定义,为全局变量,默认是0;如果是函数内定义,则在编译时会显示变量未初始化,那么是随机值。

 

enum只是定义了一个常量集合,里面没有“元素”,枚举类型是当做int类型存储的,sizeof值都为4,并且系统为其初始化为0;

 

6.对以下数据结构中data的处理方式描述正确的是(C)

struct Node
{
       int size;
char data[0];
};

分析:对于C选项,编译器会认为这就是一个长度为0的数组,而且会支持对于数组data的越界访问。

 

柔性数组,只能放在结构体末尾,是申明一个长度为0的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量,数组名这个符号本身代表了一个不可修改的地址常量(注意:数组名永远都不会是指针!),但对于这个数组的大小,我们可以进行动态分配。请仔细理解后半部分,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

 

对于0长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等。

 

注意:构造缓冲区就是方便管理内存缓冲区,减少内存碎片化,它的作用不是标志结构体结束,而是扩展。

柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)

 

7.1)成员方法又称为实例方法(暗含this指针),静态方法又称为类方法(静态方法中没有this指针);

2)类方法可以调用其他类的static方法;

3)可以在类方法中生成实例对象再调用实例方法。(在类中申请一个类对象或者参数传递一个对象或者指针都可以调用)

 

8.C++目标文件连接而成的可执行文件的缺省扩展名为.exe

 

9.继承中的父类的私有变量在子类中存在的,不能访问是编译器的行为,是可以通过指针操作内存来访问的。

 

10. 

#include<iostream>
#include<string.h>
using namespacestd;
int main() {
       float a=1;
       cout<<boolalpha<<((int)a ==(int &)a);
       float b=0;
       cout<<boolalpha<<((int)b ==(int &)b);
}

(int&)b是将地址中对应的数据按照规定的int格式显示出来。

 

11. vector::erase():从指定容器删除指定位置的元素或某段范围内的元素

vector::erase()方法有两种重载形式

如下:

iterator erase(iterator_Where);

iterator erase(iterator_First,iterator _Last);

如果是删除指定位置的元素时:

返回值是一个迭代器,指向删除元素下一个元素;

如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值