学习一门语言,就像在一座陌生的城市旅游,第一步应该找一张这座城市的地图,对这座城市有个整体的了解,然后寻找自己的目的地,不至于迷失方向。
一句话:先整体,再局部。
一.从面向过程到面向对象
1.1 面向过程的困境
当软件规模超过一定的尺度后,采用结构化程序设计,其开发和维护就越来越难控制。其根本的原因就在于面向过程的结构化程序设计的方法与现实世界(包括主观世界和客观世界)往往都不一致,结构化程序设计的思想往往很难贯彻到底。
在结构化程序设计中,采用的是“自顶向下,逐步细化( divide and conquer , stepwise refinement)”的思想。具体操作方法是模块化,是按功能来分的,所以也称功能块。在 C语言中称为一个函数,一个函数解决一个问题,即实现一个功能或一个操作。
在模块化的思想中已经出现了封装的概念,这个封装是把数据封装到模块中,即局部变量。但这是很不彻底的,因为模块是功能的抽象,而数据则是具有其个性的,一旦发生那怕是一点变化,抽象的功能模块就不再适用了。可维护性差成了制约结构化程序设计应用的瓶颈。
1.2 面向对象
对象的概念是面向对象技术的核心所在。 面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。
正因为对象是对现实的模拟,所以可更好地解决现实问题。
如下图所示。现实世界中的实体可以抽象出类别的概念。对应于计算机世界就有一个类(class)的概念,因为类是一个抽象的概念的对应体,所以计算机不给它分配内存,只给对象分配内存。
二.面向对象语言的四大特征
面向对象语言的特征,可理解为类的特征。
2.1 抽象
抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。
例如,对现实中的银行柜员进行抽象,映射到计算机,成为一个类;计算机将类实例化为对象,运行程序时,就模拟了现实的银行柜员。
即是,类是对客观世界的抽象。
2.2 封装
封装( Encapsulation)是面向对象程序设计最基本的特性,它把数据(属性)和函数(操作)合成一个整体。
即是,类将“数据”和“函数”封装在一起。
2.3 继承
继承( inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。体现了由简单到复杂的认识过程。
即是,类具有可重用性。
2.4 多态
多态性( polymorphism)多态性是考虑在不同层次的类中,以及在同一类中, 同名的成员函数之间的关系问题。
( 1) 编译时的多态性
函数的重载,运算符的重载,属于编译时的多态性。
( 2) 运行时的多态性
以虚基类为基础的运行时的多态性是面向对象程序设计的标志性特征。 体现了类推和比喻的思想方法。
三.命名空间的引入
3.1 为什么引入
命名空间是为了解决 C++中的变量、函数的命名冲突而引入的一种机制,其主要思路是将变量定义在一个不同名字的命名空间中。
命名空间就像文件夹,它包含了若干个文件(类)。
文件是把程序分块的物理方法,命名空间则是把程序分块的逻辑方法。
注意: MFC 中并没有使用命名空间,但是在.NET 框架、 MC++和 C++/CLI 中,都大量使用了命名空间。
3.2 语法格式
定义一个命名空间的语法如下:
namespace 命名空间名
{
命名空间声明内容
}
3.3 命名空间成员的使用
3.3.1 有名空间
3.3.1.1 声明单个成员
using namespace_name::name;
例如:
using std::cin;
using std::string;
3.3.1.2 声明所有成员
using namespace_name;
例如:
using namespace std;
3.3.1.3 直接引用
语法格式为:
命名空间名::类/对象
例如:
std::cout<<
3.3.2 无名空间
1.只能在当前编译单元中使用,在当前编译单元是全局的
例如:
namespace
{
int a;
int func()
{
cout<<"hello"<<endl;
}
};
2.嵌套在另一个命名空间内部。访问时,需使用外围的命名空间的名字来限定
#include<iostream>
using namespace std;
namespace space0
{
namespace
{
void func(void)
{
cout<<"space0,nameless"<<endl;
}
}
}
int main(void)
{
space0::func();
return 0;
}
3.4 命名空间的别名
C++引入命名空间,主要是为了避免成员的名称冲突。如果每个程序员都给自己的命名空间取简短的名称,那么这些命名空间本身也可能发生名称冲突;如果取很长的名称,那么使用起来很不方便。
C++为此提供了一种解决方案:命名空间别名。
格式如下:
namespace 别名=命名空间名;
例如:
namespace CDMA=Code_Division_Multiple_Access;
一个命名空间可以有多个别名,这些别名以及原来的名称是等价的,可以互换使用。