C++
1.C++的类和C里面的struct有什么区别?
(1)C++类中属性默认访问类型为private,而c++中的struct默认的访问类型为public,也无法设置private
(2)c++类可以有继承,虚函数,多态,而c++中struct不可以
2.请说出const与#define相比,有何优点?
const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
3.类成员函数的重载、覆盖和隐藏区别?
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,
规则
编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf
如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
4.面向对象的三个基本特征,并简单叙述之?
1. 封装:将客观事物抽象成类,每个类对自身的数据和
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
实行protection(private,
protected,public)
2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额
外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用
属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。
3. 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父
对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
5.构造函数可否是虚函数,为什么?析构函数呢,可否是纯虚的呢?
构造函数不能声明为虚函数的原因是:
所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.
析构函数在某些情况下必须为虚函数(比如你想让你类能够被继承,那么这个类的析构函数最好是虚的,继承一个析构函数不是虚的类是有风险的),值得补充的是,当基类的函数是虚函数,子类的重载的函数也是虚的,即使不加virtual关键字也是虚的。
6.多态的作用?
C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数的才能算作是体现了C++多态性)而重载则是允许有多个同名的函数,而这些函数的参数列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
不同,允许参数个数不同,参数
类型不同,或者两者都不同。编译器会根据这些函数的不同列表,将同名的函数的名称做修饰,从而生成一些不同名称的预处理函数,来实现同名函数调用时的重载问题。但这并没有体现多态性。
多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。
那么多态的作用是什么呢,封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。
7.程序中的局部变量、全局变量和动态申请数据具体存在于什么位置?
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。
8.new 、delete 与malloc、free的联系与区别?
简单来说,两者的区别主要有:
1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,与"+“、”
-“、”*“、”/“有一样的地位。
2. new/delete是可以重载的,而重载之后,就成为了函数。
3. malloc在申请内存的时候,必须要提供申请的长度,而且返回的指针是void*型,必须要强转成需要的类型。
4. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。
5. new/delete,其实内部也调用了malloc/free。
两者的共同点有:
1. 都必须配对使用,防止内存泄露。
2. 都可用于申请动态内存和释放内存,都是在堆中分配内存。
3. free和delete可以释放NULL指针。
9.指针和引用有什么区别?
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。★不同点:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针
可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是(引用比指针多了类型检查
10.参数传递具体有哪几种方式?
一般来说,
C里面有两种传递
1、值传递
2、指针传递
严格来看,只有一种传递,值传递,指针传递也是按值传递的,复制的是地址。
C++里面有三种传递方法:
1、值传递
2、指针传递
3、引用传递
但是严格来看,是两种,其实指针传递也是值传递,只不过是值传递的是地址。
11.虚函数的本质和实现机制?
虚函数是在基类中冠以关键字virtual关键字的成员函数,它提供了一种接口,虚函数可以在一个或多个派生类中被重定义
12.堆和栈的区别?
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态
存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,
那么在程序结束后,操作系统会自动回收。
13.在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?有何用途?
在C++中,不能定义虚构造函数,因为当开始调用虚构函数时,对象还未完成实例化,只有在构造完成后,对象才能成为一个类的名副其实的对象;但析构函数可以是虚函数,而且通常声明为虚函数,即虚析构函数.
14.关联、聚合(Aggregation)以及组合(Composition)的区别?
关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:从实现的角度讲,聚合可以表示为:
class A {…} class B { A* a; …..}
而组合表示contains-a的关系,关联性强于聚合:组合类与被组合类有相同的
生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:实现的形式是:
class A{…} class B{ A a; …}
15.有哪几种情况只能用成员初始化列表?
1.类的成员是常量成员初始化;
2.类的成员是对象成员初始化,而该对象没有无参构造函数。
3.类的成员为引用时。
16.main 函数执行以前,还会执行什么代码?
全局对象的构造函数会在main 函数之前执行,全局对象的析构函数会在main函数之后执行
17.描述内存分配方式以及它们的区别?
1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
整个运行期间都存在。例如全局变量,static 变量。
2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意
多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。
18.当一个类A 中没有声明任何成员变量与成员函数,这时sizeof(A)的值是多少,如果
不是零,请解释一下编译器为什么没有让它为零。
(Autodesk)肯定不是零。举个反例,如果是零的话,声明一个class A[10]对象数组,
而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。
19.#include
和#include “filename.h”有什么区别?
答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。
20.const 有什么用途?
const 用于定义常量:const定义的常量编译器可以对其进行数据静态类型的安全检查。const修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型的时候,将“值传递”改为“const 引用传递”可以提高效率。
const 修饰函数的返回值:如果给“指针传递”的函数返回值加const,则返回值不能直接修改,且返回值只能被赋值给const 修饰的同类型指针。
const char * GetChar(void) {};
char *ch =GetChar();//error
const char *ch=GetChar();//correct
const 修饰类的成员函数(函数定义体):任何不需要修改数据成员的函数应该使用const 修饰,这样即使不小心修改了数据成员或调用了非const成员函数,编译器也会报错。
int GetCount(void) const;
21.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern 声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似。
22.纯虚函数的作用是什么?
纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在纯虚函数不具备函数的功能,一般不能直接被调用。
从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。
抽象类中不仅包括纯虚函数,也可包括虚函数。l抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。
23.请说明拷贝构造函数的特点?为什么类中除了构造函数还需要拷贝构造函数?
拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为复制初始化);
24.请说明多继承下存在组合关系时,构造函数的执行次序。
1、如果在基类和派生类中都包含其他类的对象(即有对象成员),则在创建派生类的对象时,首先执行基类的对象成员的构造函数,接着执行基类的构造函数,然后执行派生类的对象成员
的构造函数,最后才执行派生类的构造函数。P156
25.请说明为什么一般情况下构造函数的执行次序与析构函数相反?
26.Static修饰的类成员、const修饰的类成员与其他成员有什么区别?
27.说明const在修饰类函数成员时的作用?
类的成员函数后面加const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。
在
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加const,而对于改变数据成员的成员函数不能加const。所以const 关键字对成员函数的行为作了更加明确的限定:有const 修饰的成员函数(指const 放在函数参数表的后面,
而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有const 修饰的成员函数,对数据成员则是可读可写的。
28.说明函数调用过程中用const修饰的作用?
29.抽象类有什么作用?如何使用抽象类?
纯虚函数是指没有具体实现的虚函数,一个类包含了纯虚函数就成为了抽象类,这样的类不能被创建实例,所以可以作为抽象接口,由子类来定义纯虚函数的具体实现。