面向对象的基本概念
1. 简述 C 和 C++ 有何不同?
宏观上:
- C 语言属于面向过程语言,通过函数来实现程序功能。而 C++ 是面向对
象语言,主要通过类的形式来实现程序功能。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 - 使用 C++ 编写的面向对象应用程序比 C 语言写的程序更容易维护、扩展性更强。C++ 多用于开发上层的应用软件。而 C 语言代码体积小,执行效率高,多用于编写系统软件和嵌入式开发。
微观上:略(参考下文)
2. C 和 C++ 中结构体有何不同?
- C 语言中的结构体不能为空,否则会报错,C 要求一个结构体至少有一个成员
- C 语言中的结构体只涉及到数据结构,而不涉及到算法,也就是说在 C 中数据结构和算法是分离的。换句话说就是 C 语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在 C++ 中既可以定义成员变量又可以定义成员函数, C++ 中的结构体和类体现了数据结构和算法的结合。
不过虽然 C 语言的结构体中不能定义成员函数,但是却可以定义函数指针,不过函数指针本质上不是函数而是指针,所以总的来说 C 语言中的结构体只是一个复杂数据类型 ,只能定义成员变量,不能定义成员函数,不能用于面向对象编程。来看一个函数指针的例子:
int My_Add(int a, int b)
{
return a + b;
}
int My_Sub(int a, int b)
{
return a - b;
}
struct CTest
{
int(*Add)(int, int); //函数指针
int(*Sub)(int, int);
};
int main()
{
struct CTest test;
int ret = 0;
test.Add = My_Add;
test.Sub = My_Sub;
ret = test.Add(3, 5);
printf("%d", ret);
}
特别注意:
struct CTest
{
char ch;
int num;
};
int main()
{
CTest test; // C 中必须写成 struct CTest test;
test.num = 1;
printf("%d", test.num);
}
这样在 C 语言中是编译不过去的,原因提示未定义标识符 CTest 。总的来说就是在 C 语言中结构体变量定义的时候,若为 struct 结构体名 变量名定义的时候,struct 不能省略。但是在 C++ 之中则可以省略 struct。
3. C++ 中的结构体和类有何区别?
- 对于成员访问权限以及继承方式,class 中默认的是 private,而struct中则是 public 。
- 概念:class 和 struct 的语法基本相同,从声明到使用,都很相似,但是 struct 的约束要比 class 多,理论上,struc t能做到的 class 都能做到,但 class 能做到的 struct 却不一定做的到。
- 类型:struct 是值类型,class 是引用类型,因此它们具有所有值类型和引用类型之间的差异。
- 效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此 struct 常用来处理作为基类型对待的小对象,而 class 来处理某个商业逻辑。
- 关系:struct 不仅能继承也能被继承 ,而且可以实现接口,不过 class 可以完全扩展。内部结构有区别,struct 只能添加带参的构造函数,不能使用 abstract 和 protected 等修饰符,不能初始化实例字段。
特别注意:
(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选 struct 。
(2) 在表示数据量大、逻辑复杂的大对象时,首选 class 。
(3) 在表现抽象和多级别的对象层次时,class 是最佳选择
4. 简述面向对象的三个基本特征。
- 1.封装
面向对象中的封装特性是指将客观事物抽象成类,即把数据和操作数据的函数封装成类,对数据的访问只能通过向用户暴露的接口。封装可以隐藏实现细节,使得代码模块化,这样能避免受到外界的干扰和误用,从而确保了安全。【数据封装实现了数据隐藏(针对于数据)和数据抽象(针对于操作函数)】 - 2.继承
继承是面向对象中的核心技术。它允许一个类(子类)从另一个已有类(父类)中继承,这样在子类中即使不写任何代码也能够继承父类中保护和公有成员(父类中的私有成员不能够被子类继承),真正实现了不通过粘贴、复制的方式实现代码重用。面向对象中的多态性、动态绑定技术都是在继承的基础上实现的。 - 3.多态
多态是面向对象技术的精华。在面向对象语言中,接口的多种不同的实现方式即为多态。多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在C++中都是通过虚函数实现的。
5. 什么是局部类?
在 C++中允许在函数体内定义一个类,这样的类被称之为局部类。对于局部类来说,它只能够在函数内部使用,函数外是无法访问局部类的,因为局部类被封装在了函数的局部作用域中。
参考资料:
详解C结构体、C++结构体 和 C++类的区别