问:说说C++和C的主要区别?
答:
例如:Windows操作系统、Linux操作系统大部分内核都是用C语言编写的。从名称上,可以说C++是C语言的超集,它兼容C语言,同时扩充了许多内容,例如面向对象、STL模板库等。总之,C语言属于面向过程编程语言,侧重于函数;而C++属于面向对象编程语言,侧重于类。
问:面向对象的程序设计思想是什么?
答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。
问:面向对象与面向过程分别是什么?
答:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;以过程为中心的编程思想,以算法进行驱动。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。以对象为中心,以消息进行驱动。
问:面向过程与面向对象的优缺点?
答:
面向过程
面向对象
问:面向对对象与面向过程的区别?
答:
问:什么是对象?
答:对象是指现实世界中各种各样的实体。它可以指具体的事物也可以指抽象的事物。
问:对象都具有二方面特征是什么?分别是什么含义?
答:对象都具有的特征是:静态特征和动态特征。
静态特征是指能描述对象的一些属性,动态特征是指对象表现出来的行为。
问:什么是类?
答:类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程(以及设计)技术。类的接口包括用户所能执行的操作:类的实现则包括类的数据成员、负责接口实现的函数以及定义类所需的各种私有函数。
封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部分。类想要实现数据抽象和封装,需要首先定义一个抽象数据类型。在抽象数据类型中,由类的设计者负责考虑类的实现过程;(摘自《Primer c++第五版》)
关于接口和实现分离的技术(某网友的博客文章):https://blog.csdn.net/starlee/article/details/610825。
问:写出结构体定义与声明的几种形式?
答:struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。
struct tag {
member-list
} variable-list ;
在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例:
1. // 此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c。同时又声明了结构体变量s1,这个结构体并没有标明其标签。
struct {
int a;
char b;
double c;
} s1;
2. // 同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c,结构体的标签被命名为SIMPLE,没有声明变量。
struct SIMPLE{
int a;
char b;
double c;
};
// 用SIMPLE标签的结构体,另外声明了变量t1、t2、t3。
struct SIMPLE t1, t2[20], *t3;
3.// 也可以用typedef创建新类型
typedef struct{
int a;
char b;
double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
4.// 此结构体的声明包含了其他的结构体
struct COMPLEX{
char string[100];
struct SIMPLE a;
};
// 此结构体的声明包含了指向自己类型的指针
struct NODE{
char string[100];
struct NODE *next_node;
};
5. struct B;
// 对结构体B进行不完整声明
// 结构体A中包含指向结构体B的指针
struct A{
struct B *partner;
//other members;
};
// 结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B{
struct A *partner;
//other members;};
问:类与结构体的区别是什么?
答:
问:哪种使用的情况下适合结构体还是类?
答:
问:什么是抽象?
答:抽象的作用就是表示同一类事物的本质。例如在c/c++中,数据类型就是对一批具体的数的抽象。
类是对象的抽象,而对象则是类的特例,或者说是实例。
抽象包括两个方面:一是过程抽象,二是数据抽象。
问:什么是封装?
答:封装是指可以对一个对象进行封装处理,把它的一部分属性和功能对外界屏蔽,也就是说从外界是看不到的,甚至是不可见的。
封装的特点:
问:继承的作用?
答:采用继承的方法可以很方便地利用一个已有的类建立一个新的类,这就可以重用已有软件中的一部分甚至大部分,节省了编程工作量。
问:类的特性?
答:封装(维护性),继承(复用性)和多态(扩展性)。抽象,不属于类的特性,特点是灵活性。
问:抽象类是什么?作用是什么?
答:抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。
问:什么是接口类?特点是什么?
答:接口类就是只提供接口不提供实现的类,就是接口类,接口类和抽象类对C++而言,没有什么区别。
接口类有如下特点:
问:什么是友元类?
答:类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元(friend)。如果类想把一个函数作为它的友元,只需要增加一条以friend关键字开始的函数声明语句即可。
问:多重继承与多继承的区别?
答:多继承是指一个子类继承多个父类。多继承对父类的个数没有限制,继承方式可以是公共继承、保护继承和私有继承。
多重继承特点总结如下:
问:在头文件中进行类的声明,在对应的实现文件中进行类的定义有什么意义?
答:这样可以提高编译效率。因为这样不仅文件的代码设计方便,而且只需要编译一次就能够生成.obj文件。再次应用该类的地方,就不会重新编译了。
问:如何定义两个类互为成员的情况?以下代码正确吗?
class A
{
public:
private:
B m_B;
};
class B
{
private:
A m_A;
};
答:不正确。因为在类A之前,没有发现类B的定义,直接使用了类B,但是却没有发现类B的定义,而只是发现了类B的声明。修改代码为:
classB;
class A
{
public:
private:
B *m_B;//或者B m_B();
};
class B
{
private:
A m_A;
};
分析:
本题笔者认为主要考点是类的定义与声明的区别。
B m_B只是类B的声明,而 B *m_B;//或者B m_B();是类B的定义。
当我们new出一个对象(即B *m_B),就会自动调用构造函数完成初始化,也就完成了类的定义。
当我们B m_B()时,由于m_B()意思是调用了类B默认的构造函数,完成类的定义。
类的定义与类的声明区别就在于定义时是自动调用了构造函数,因此才真正创建一个对象m_B,而声明并没有调用构造函数,所以也没有创建对象,只是声明而已。
问:成员变量有哪些访问方式(或者访问控制方式)?
答:成员变量根据访问权限有private、protect和public 3种访问方式。
问:C++中的private的成员变量可以由哪些函数访问?
答:private只能由本类中的成员函数或者友元函数来访问。