从C语言到C++的进阶之面向对象、using与命名空间(篇四)

一、面向过程到面向对象

1、面向过程编程思想
C语言是典型的面向过程编程语言,面向过程是一种以过程为中心的编程思想,通过分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向过程编程思想的核心:功能分解,自顶向下,逐层细化(程序=数据结构+算法)。面向过程编程语言存在的主要缺点是不符合人的思维习惯,而是要用计算机的思维方式去处理问题

2、面向对象三大特性
(1)封装
把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。
(2)继承
继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力。继承的作用:避免公用代码的重复开发,减少代码和数据冗余。
(3)多态
多态性可以简单地概括为“一个接口,多种方法",字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。

面向对象重用率低、易维护,关于面向过程与面向对象的区别,可以看成盖饭与炒饭的区别,盖饭中的菜与饭是分开的,若需要将菜去除掉可以很容易;但是在炒饭中,菜与饭是炒在一起的,想要去除里面的菜则会变得很麻烦。

二、namespace的使用

1、命名空间的使用

  • 命名空间下可以存放变量、函数、类、结构体等
  • 命名空可以重名:重名的命名空间相当于做了个合并操作
  • namespace可以嵌套
  • 声明一段命名空间 ,且必须定义在全局范围内
  • 练习代码
#include <iostream>  //标准输入输出流
using namespace std;  //声明一段命名空间 ,且必须定义在全局范围内 

namespace A
{
    
    
	int a= 120;
	void fun()
	{
    
    
		cout << "我在namespace中!" << endl;
	}
	struct st
	{
    
    
	};
	class obj
	{
    
    
	};
}
namespace B
{
    
    
	int a= 99;
	int b= 990;
}
namespace B
{
    
    
	int c= 9990;
	namespace C
	{
    
    
		int c= 1;
	}
}
int main()  //main函数应该是int类型,不能是void 
{
    
    
	cout << A::a << endl;  //输出作用域A下的变量a 
	cout << B::a << endl;  //输出作用域B下的变量a 
	A::fun();  //调用命名空间内的函数 
	cout << B::c << endl;  //输出重名命名空间内的变量 
	cout << B::C::c << endl;  //输出嵌套 命名空间内的变量 
	return 0;
} 

2、若在命名空间内声明了函数,那么在全局作用域内定义该函数时必须用::表示出作用域。
同时,在调用该函数时也需要加上作用域标识符::

#include <iostream>  //标准输入输出流
using namespace std;  //声明一段命名空间 ,且必须定义在全局范围内 

namespace AA
{
    
    
	void fun1(int x);  //对fun1函数进行声明,但没有定义和初始化 
}
void AA::fun1(int x)  //对fun1函数进行定义 
{
    
    
	cout << "I am "  << x << endl;
}
int main()
{
    
    
	AA::fun1(9420);
	return 0;
}
  • 如果命名空间没有名字,那么这个命名空间内的所有成员都被编译器加上了static修饰。也就是静态的,只能在当前文件使用,有了内部链接属性。
  • 命名空间也是可以取别名的 比如有了AA命名空间,使用namespace NewAA= AA; ,也就是给AA取了个别名叫NewAA,调用时用法和AA是一模一样的了 。

三、using的用法

1、using的基本用法

#include <iostream>  //标准输入输出流
using namespace std;  //声明一段命名空间 ,且必须定义在全局范围内 

namespace spA
{
    
    
	void fun1(int x)  //对fun1函数进行定义 
	{
    
    
		cout << "I am "  << x << endl;
	} 
	int a=9;
}

int main()
{
    
    
	using spA::fun1;
	fun1(9420);
	//若没使用using则需要这样调用命名空间内的函数,spA::fun1(9420);  
	using spA::a;
	cout << a << endl;
	return 0;
}

2、当using声明的标识符和其他标识符有作用域的冲突时,会产生二义性(编译器无法确定该调用哪个) ;
此时可以使用using编译指令来解决,这样就可以与命名空间外的同名变量公平竞争,就近原则,它使得整个命名空间的标识符可用 。

#include <iostream>  //标准输入输出流
using namespace std;  //声明一段命名空间 ,且必须定义在全局范围内 

namespace AA
{
    
    
	int a= 12;
}
int main()
{
    
    
	int a= 99;
	using namespace AA;
	cout << "使用using namespace ×× 的结果:" << a << endl;
	return 0;
}

3、使用using时的注意点
需要记住的关键问题是当引入一个全局的using编译指令时,就为该文件打开了该命名空间,它不会影响任何其他的文件,所以可以在每一个实现文件中调整对命名空间的控制。比如,如果发现某一个实现文件中有太多的using指令而产生的命名冲突,就要对该文件做个简单的改变,通过明确的限定或者using声明来消除名字冲突,这样不需要修改其他的实现文件。

猜你喜欢

转载自blog.csdn.net/Viewinfinitely/article/details/111934916