笔记——2

列举并解释c++中的4种运算符转化以及它们的不同点
1.const_cast操作符:用来帮助调用哪些应该使用却没有使用const关键字的函数。换句话说,就是供程序设计师
在特殊情况下将限制为const成员函数的const定义解除,使其能更改特定属性


2.dynamic_cast操作符:如果启动了支持运行时间类型信息(RTTI),dynamic_cast可以有助于判断在运行时所指向对象的
确切类型。它与typeid运算符有关。可以将一个基类的指针指向许多不同的子类型(派生类),然后将被转换基础
类的对象还原成原来的类。不过,限于对象指针的类型转换,而非对象变量。


3.reintrpret_case操作符:将一个指针转换其他类型的指针,新类型的指针与旧指针可以毫不相关。通常
用于某些非标准的指针数据类型转换,如何将void*转换为char*。它可以用在指针和整型数之间的类型转换上。注意:
它存在潜在的危险,除非有使用它的充分理由,否则就不要使用它。例如,它能够将一个int*的指针转换为float*类型
的指针,但是这样就会很容易造成整数数据不能被正确的读取


4.static_cast操作符:它能在相关的对象和指针类型之间进行类型转换.有关的类之间必须通过继承,构造
函数或者转换函数发生联系。static_cast操作符还能在数字(原始的)类型之间进行类型转换。通常情况下,
static_cast操作符大多用于将数域宽度较大的类型转换为较小的类型。当转换类型是原始数据类型时,这种
操作可以有效禁止编译器发送警告


描述面向对象技术的基本概念
类:具有相似的内部状态和运动规律的实体集合。类来自人们认识自然,认识社会的过程。在这一过程中,
人们主要使用两种方法:由特殊到一般的归纳法和由一般到特殊的演绎法。在归纳的过程中,从一个个具体的事物中把共同的
特征
抽取出来,形成一个一般的概念。在演绎的过程中又把同类的事物,根据不同的特征分成不同的小类。


对象:指现实世界中各种各样的实体,也就是类的示例。它既可以指具体的事物,也可以指抽象的事物。每个
对象都有自己的内部状态和事物。


消息:指对象间相互联系和相互作用的方式。一个消息主要由5部分组成:发送消息的对象,接收消息的对象,
消息传递的方法,消息内容,反馈。


类的特征:抽象,继承,封装,重载和多肽


class和struct有什么区别
1.C语言的struct与C++的class的区别:struct只是作为一钟复杂数据类型定义,不能用于面向对象编程
2.C++中的strcut和class的区别:对于成员访问权限以及继承方法,class中默认是private的,而struct中
则是public的。class还可以用于表示模板类型,struct则不行。


与全局对象相比,使用静态数据成员有什么优势
主要有以下两种优势
1.静态数据成员没有进入程序的全局名字空间,因此不存在程序中其他全局名字冲突的可能性
2.使用静态数据成员可以隐藏信息。因为静态成员可以是private成员,而全局对象不能


有哪几种情况只能用initalization list,而不能用assignment
当类中含有const,reference成员变量和基类的构造函数时都需要初始化列表


main函数执行前还会执行什么代码
全局对象的构造函数会在main函数之前执行


C++中的空类默认会产生哪些类成员函数
C++的空类中,默认会产生默认构造函数,复制构造函数,析构函数,赋值函数以及取值运算


构造函数和析构函数是否可以被重载
1.构造函数可以被重载,因为构造函数可以有多个,且可以带参数
2.析构函数不可以被重载,因为析构函数只能有一个,且不能带参数




构造函数explicit与普通构造函数的区别
普通构造函数能够被隐式调用,而explicit构造函数只能被显示调用(不能通过等号运算符操作)


析构函数的执行顺序
在main函数中定义了两个类B的对象,它们的基类是A。由于这两个对象都是在栈中分配的,当main函数退出
时会发生析构,又因为obj1比obj2先声明,所以obj2先析构。它们析构的顺序是首先执行B的析构函数,
然后执行A的析构函数 


编译器与默认的copy constructor
如果用户没有自定义复制构造函数,并且在代码中用到了复制构造函数,那么编译器就会生成默认的复制
构造函数;但如果用户定义了复制构造函数,那么编译器就不会再生成复制构造函数
如果用户定义了一个构造函数,且不是复制构造函数,而此时在代码中用到了复制构造函数,那么编译器
也还会生成默认的复制构造函数;如果没有使用,则编译器就不会生成默认的复制构造函数


复制构造函数与赋值函数有什么区别
1.复制构造函数时一个对象来初始化一块内存区域,这块内存就是新对象的内存区。
例如:
class A;
A a;
A b = a;   复制构造函数调用
A b(a);    复制构造函数调用
  
而赋值函数就是一个已经被初始化的对象来进行operator=操作。例如
class A;
A a;
A b;
b = a;//赋值函数调用


2.一般来说在数据成员包含指针对象的时候,应付两种不同的处理需求: 一种是复制指针对象,一种是引用指针
对象。复制构造函数在大多数情况下是复制,赋值函数则是引用对象


3.实现不一样。复制构造函数首先是一个构造函数,它调用的时候是通过参数参数传进来的那个对象初始化产生了一个对象。
赋值函数则是把一个对象赋值给一个原有的对象,所以,如果原来的对象有内存分配,要先把内存释放掉,
而且还要检查一下两个对象是不是同一个对象,如果是的话,就不做任何操作


重载和重写的区别?
重载是编写一个与已有函数同名但是参数表不同(参数数量或参数类型不同)的方法,它具有如下所示的特征:
1.方法名必须相同
2.参数列表必须不相同,与参数类别的顺序无关
3.返回值类型可以不相同


重写是派生类重写基类的虚函数,它具有如下所示的特征
1.只有虚方法和抽象方法才能够被覆盖(重写)
2.相同的函数名
3.相同的参数列表
4.相同的返回值类型


C++中的继承主要有3种关系:public,protected和private
1.public继承
public继承是一种接口继承,子类可以代替父类完成接口所声明的行为。此时子类可以自动转换为父类
接口。从语法角度上来说,public继承会保留父类中成员(包括函数和变量等)的可见性不变,也就是说,如果
父类中的某个函数时public的,那么在被子类继承后仍然是public的
2.protected继承
protected继承是一种实现继承,子类不能代替父类完成接口所声明的行为,此时子类不能自动转换成父类
的接口。从语法角度来说,protected继承会将父类中的public的可见性的成员修改为protected可见性,相当于
在子类中引入了protecteded成员,这样在子类中还是同样可以调用父类的protecteded和public成员,子类
的子类也就可以调用被protecteded继承的父类的protected和public成员
3.private继承
private继承是一种实现继承,子类不能代替父类完成父类接口所声明的行为,此时子类不能自动转换诶为
父类的接口。从语法的角度来讲,private继承会将父类中的public和protected可见性的成员修改为private可见性
这样一来,虽然子类中同样还是可以调用父类的protected和public成员,但是子类的子类就不可以调用
private继承的父类的成员了


什么是多态
多态的定义:同一操作作用于不同对象,可以有不同的解释,产生不同的执行结果。有两种类型的多态性;
1.编译时的多态性。编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据
传递的参数,返回的类型等信息决定实现何种操作。
2.运行时的多态。运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C++中,
运行时的多态通过虚成员实现。


为什么需要引入抽象基类和纯虚函数
纯虚函数在基类中没有定义的,必须在子类中加以实现,很像java中的接口函数。如果基类含有一个或多个纯虚函数,
那么它就属于抽象基类,不能被实例化
为什么要引入抽象基类和纯虚函数呢?原因有以下两点
1.为了方便使用多态
2.在很多情况下,基类本身生成对象是不合理的

虚函数和纯虚函数的区别?
虚函数和纯虚函数有以下方面的区别
1.类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的
子类里面可以覆盖,这样编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数
的声明而已,它要留到子类里去实现

2.虚函数在子类里面也可以不重载;但纯虚函数必须在子类去实现,这就像java的接口一样。通常把
很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为
很难预料到父类里面的这个函数不在子类里面不去修改它的实现

3.虚函数的类用于"实作继承",也就是说继承接口的同时也继承了父类的实现。当然,大家也可以完成自己的实现。
纯虚函数的类用于"介面继承",即纯虚函数关注的是接口的统一性,实现由子类完成。

4.代纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重写其虚函数,才能使用。
这样的类也叫抽象类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值