温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++ 类的引入,名字空间的意义

发布时间:2020-07-19 15:17:48 来源:网络 阅读:873 作者:BarnabyRoss 栏目:编程语言

   有一天,公司来了新人,我要对他的一些属性做些基本的记录。比如,我得知道他的姓名,年龄等。那么通过编程来记录他的这些属性,很明显,我得有一个保存姓名的数组,保存年龄的数组,但是随着记录越来越完善,那么我就得不断的添加数组,如果人不多还好,但是一旦人多了起来之后,每来一个人,都要重开一边数组记录他的基本信息,首先这样代码会变得又烂又长,而且,不便于开发者管理及开发程序。所以,为了解决这种具有同一属性的数据,我们将它们的同一属性封装成一种类型,这种类型在C语言中称为结构体。

   当有了这种类型之后,我可以对这些类型进行操作,比如,输出某某的姓名,年龄等等。在C中,我只要调用printf函数,再通过结构题变量的访问方式就可以轻松输出我所想要的信息,那么既然我需要得到他的信息,为何不将这种输出函数一起封装在结构体中呢?不仅仅是输出函数,或者是别的一些对数据进行操作的函数也可以封装在结构体中。

   于是,新诞生的C++语言就在C语言的基础上,对结构体进行了强化,就有了类这种数据类型。类这种数据类型是一种既有成员变量又有成员函数的新类型。(哦对了,顺便带一句,C++是一种面向对象的编程语言,而面向对象的三大特征就是:封装、继承、多态)。比如有一下代码:

#include <stdlib.h>
#include <stdio.h>


class People{
	
	public:	
		char* name;
		int age;
		char* job;
	public:
		void PrintInfo ( void ){
		
			printf ( "%10s%4d%10s\n", name, age, job );
		}
};


int main ( ){
	
	People person;
	person.name = "chentong";
	person.age = 20;
	person.job = "student";
	person.PrintInfo();
	
	return 0;
}

   这段代码就是典型的使用类来定义的“人”的类型。

   我们都知道,当去一家公司工作的时候,不可能让一个人完成所有代码,每个人都有各自的任务,然后将每个人写的代码放在一起成功运行,才是完成了一个项目。那么比如说,有两名员工A和B,A的任务是写一个关于“人”这个属性的代码,B的任务是写一个关于“狗”这个属性的代码。

那么,这个时候,A就需要将他的代码分为两个文件,一个.cpp,一个.h文件来实现。

如,A的代码:

头文件中的代码:

class People {

private:
	char* name;
	char age;
	char* job;

public:
	void SetName(char* name);
	int SetAge(char age);
	void SetJob(char* job);
	void PrintInfo(void);
};

CPP文件中的代码:

#include <stdio.h>
#include <stdlib.h>
#include "person.h"
#include <iostream>

using namespace std;

void People:: SetName(char* name) {

	this->name = name;
}

int People::SetAge(char age) {

	if (age < 0 || age > 150) {

		this->age = 0;
		return -1;
	}

	this->age = age;
	return 0;
}

void People::SetJob(char* job) {

	this->job = job;
}

void People::PrintInfo(void) {

	printf("%10s%4d%10s\n", this->name, this->age, this->job);
}

B的代码:

头文件中的代码:

class Dog {

private:
	char* name;
	char age;
public:
	void SetName(char* name);
	int SetAge(char age);
	void DisplayInfo(void);
};

CPP文件中的代码:

#include <stdlib.h>
#include <stdio.h>
#include "dog.h"
#include <iostream>

using namespace std;

void Dog::SetName(char* name) {

	this->name = name;
}

int Dog::SetAge(char age) {

	if (age < 0 || age > 150) {

		this->age = 0;
		return -1;
	}

	this->age = age;
	return 0;
}

void Dog::DisplayInfo(void) {

	printf("%10s%4d\n", this->name, this->age);
}

   这样以来就分别完成了各自的任务。现在,有第三个员工C,他的任务是在主函数中实现他们两人的代码功能。于是,C的工作代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "person.h"
#include "dog.h"

using namespace std;

int main(int argc, char** argv) {

	People person;
	Dog dog;
	person.SetName("chentong");
	person.SetAge(20);
	person.SetJob("student");
	person.PrintInfo();

	dog.SetName("hashiqi");
	dog.SetAge(4);
	dog.DisplayInfo();

	system("pause");
	return 0;
}

   到这里为止,只要三名员工就能完成这个项目。那么,如果这个项目非常复杂,需要1000个人合作完成,大家你写你的,我写我的,可能就会出现,定义了相同的变量名或者是定义了相同的函数名的情况。这样一来,在主函数中使用这些函数时,编译器就无法分清,调用的到底是谁写的函数,毕竟,函数名相同。所以,C++为了解决这样的一个问题,就引入了名字空间这样一个概念,把自己的工作任务需要写的代码,放在自己定义的名字空间中,这样,在主函数中使用时,只要指明是哪个名字空间中的就可以了。比如,A的工作代码,放在了名为P的名字空间中,

namespace P {

	void People::SetName(char* name) {

		this->name = name;
	}

	int People::SetAge(char age) {

		if (age < 0 || age > 150) {

			this->age = 0;
			return -1;
		}

		this->age = age;
		return 0;
	}

	void People::PrintInfo(void) {

		printf("%10s%4d\n", this->name, this->age);
	}

	void PrintVersion(void) {

		printf("chentong is a person\n");
	}



}
namespace P {

	class People {

	private:
		char* name;
		char age;
	public:
		void SetName(char* name);
		int SetAge(char age);
		void PrintInfo(void);
	};

	void PrintVersion(void);
}

   这样一来,在主函数中使用时,只要指明是哪个名字空间中的,就不会出现,函数名同名,使用时报错的现象了。(名字空间

当多个人同时进行大型项目的程序开发时,可能会出现大家定义的函数名相同的情况,那么,为了解决命名冲突的问题。如果把相同名字的函数放在不同的名字空间内,不会报错,因为互不影响。


解决了如何避免多人同时工作,定义的函数名同名的问题。

   接下来,又面临了一个新的问题。如何在主函数中,不出任何问题的使用这些定义在各自空间中的类。首先讲第一种,直接在想要使用的类前加上该类的名字空间,比如:

P::People person;
D::Dog dog;

   这样以来,就说明了,我使用的是名字空间P中的People类;名字空间D中的Dog类。

   当然,也可以不这么用,如果你想,像普通类一样使用,那么你可以在global namespace中定义,

using P::People; //把People放入global namespace,以后可以直接使用People来代替P::People
using D::Dog;   //把Dog放入global namespace,以后可以直接使用Dog来代替D::Dog

   这是第二种使用方式。

   当然还有第三种,就是,直接在global namespace中定义

using namesapce P;
using namespace D;

   基本上,到这里为止就差不多把C++中的名字空间给讲清楚了。当然,还有类的使用。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI