首页 > 编程语言 >C++:命名空间与输入输出

C++:命名空间与输入输出

时间:2024-08-15 11:23:03浏览次数:11  
标签:rand int 输入输出 namespace C++ printf 命名

目录

前言

一、命名空间

1.1 namespace的价值

1.2 namespace的定义

1.3 命名空间的使用

二、C++输入&输出


前言

    C++是一种面向对象的计算机程序设计语言,‌它扩展了C语言的功能,‌并引入了面向对象编程的概念,‌如类、‌继承和多态等,C++是以C语言为基础进行了拓展与创新,C++兼容C语言绝大多数的语法。

    还记得我们在学C语言时的第一个代码程序吗?

#include<stdio.h>
int main()
{
 printf("hello world\n");
 return 0;
}

    C++也兼容这种写法,但是C++有⼀套自己的输入输出,严格说C++版本的hello world应该是这样写的。

#include<iostream>
using namespace std;
int main()
{
 cout << "hello world\n" << endl;
 
 return 0;
}

    现在还不认识不要紧,本篇会讲解C++的一些基础知识, 看完后就明白是怎么一回事了。

一、命名空间

1.1 namespace的价值

    c语言项目类似下面程序这样的命名冲突是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
 printf("%d\n", rand);
 return 0;
}

    这里我们可以看到编译器报错了,因为在stdlib头文件中包含一个名为rand的函数与定义的变量rand发生了命名冲突。在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突名字污染,namespace关键字的出现就是针对这种问题的。 

1.2 namespace的定义

• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员,命名空间中可以定义变量/函数/类型等。

• namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不再冲突了。

#include <stdio.h>
#include <stdlib.h> 
// otto是命名空间的名字 
namespace otto
{
 // 命名空间中可以定义变量/函数/类型 

 int rand = 10;//变量

int Add(int left, int right)//函数
 {
 return left + right;
 }

class otto//类
 {
 public:
	void man()
	{
		return;
	}
 private:
		int x;
 };

}
int main()
{
 printf("%p\n", rand);
 
 printf("%d\n", otto::rand);
 return 0;
}

     第一个printf默认访问的是全局的rand函数地址,第二个printf用到的是otto命名空间里的rand,这样就解决了命名冲突的问题。

• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型声明或定义的逻辑,所有有了域隔离,命名冲突就解决了,局部域和全局域除了会影响 编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。 

• namespace只能定义在全局,当然他还可以嵌套定义。

namespace otto
{
	 
	namespace kun
		{
		int rand = 1;
		int Add(int left, int right)
		{
			return left + right;
		}
	} 
}
int main()
{
	printf("%d\n", otto::kun::rand);
	printf("%d\n", otto::kun::Add(1, 2));
	return 0;
}

• 项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。

• C++标准库都放在⼀个叫std(standard)的命名空间中。

1.3 命名空间的使用

    编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找,所以下面程序会编译报错,

namespace N
{
	int a = 0;
	int b = 1;
}
int main()
{
	printf("%d\n", a);
	return 0;
}

所以我们要使用命名空间中定义的变量/函数,有三种方式:

• 指定命名空间访问,项目中推荐这种方式。

int main()
{
 printf("%d\n", N::a);
 return 0; 
}

    通过“命名空间+::”的方式在指定命名空间访问。

• using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。

using N::b;
int main()
{
 printf("%d\n", N::a);
 printf("%d\n", b);
 return 0; 
}

    展开后使用这个变量时就不用带命名空间了。 

• 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。 

using namespce N;
int main()
{
 printf("%d\n", a);
 printf("%d\n", b);
 return 0; 
}

二、C++输入&输出

 • <iostream>是Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输 出对象。

std::cin是 istream 类的对象,它主要面向窄字符的标准输入流。

std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。

std::endl 是⼀个函数,流插入输出时,相当于插入⼀个换行字符加刷新缓冲区。

• <<是流插入运算符,>>是流提取运算符。

• 使⽤C++输⼊输出更方便,不需要像printf/scanf输⼊输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型,其实最重要的是 C++的流能更好的支持自定义类型对象的输入输出。

• IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这里我们只能简单认识⼀下C++ IO流的用法,后面会有专门的⼀个章节来细节IO流库。

cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使用方式去用他们。

• ⼀般日常练习中我们可以using namespace std,实际项目开发中不建议使用

• 这里我们没有包含,也可以使用printf和scanf,在包含间接包含了。vs系列编译器是这样的,其他编译器可能会报错。

#include <iostream>
using namespace std;
int main()
{
	int a ;
	double b;
	char c ;
	// 可以自动识别变量的类型 
	cin >> a;
	cin >> b >> c;
	cout << a << endl;
	cout << b << " " << c << endl;
	return 0;
}


     本篇内容就先到这里了,希望对各位有帮助,喜欢不要忘记三连,蟹蟹。

标签:rand,int,输入输出,namespace,C++,printf,命名
From: https://blog.csdn.net/2401_86551514/article/details/141200118

相关文章

  • c#和C++数据交互 一CLR篇
    1:配置VC++目录:包含目录:头文件的所在路径,#include时用“”链接器:输入:附加依赖项如果是clr模板,一定要用lib文件,不然会报链接错误2:先建立一个简单的dll模板,实现加法运算点击查看代码NativeCalculate.hclass__declspec(dllexport)NativeCalculate{public: ......
  • C++ 编译过程
    源码——>预处理器.i文件——>编译器.s文件——>汇编器.o文件——>链接器——>执行程序 预处理器:读取代码里#开头的命令,并把他插入到程序文本里,生产已.i为后缀名的文件编译器:把.i 文件生成汇编文件 .s汇编器:把汇编文件生成二进制文件.a 链接器:链......
  • java语言,MySQL数据库;电影推荐网站 30760(免费领源码)计算机毕业设计项目推荐万套实战教
    摘 要随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的电影推荐网站;电影推荐网站的管理工作系统化、规范化,也会提高平台形象,提高管理效率。本电影推荐网站是针对目前电影推荐网站的实际需求,从实际工作出发,对过去的电影......
  • java语言,MySQL数据库;基于Web的高校知识共享系统设计与实现 32050(免费领源码)计算机毕业
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对高校知识共享系统等问题,对高校知识共享系统进行研究分析,然后开发设计出高校知识共享系统以......
  • java语言,MySQL数据库;23825基于java的员工考勤系统(免费领源码)计算机毕业设计项目推荐万
    摘 要由于数据库和数据仓库技术的快速发展,员工考勤系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。考勤管理系统对处理对象和服务对象,自身的系统结构,处理能力,都将适应技术发展的要求发生重大的变化。员工考勤系统除了具有共享系统的全部功能以外,能通过......
  • Qt/C++地图坐标纠偏/地球坐标系/火星坐标系/百度坐标系/互相转换/离线函数
    一、前言说明为什么需要地球坐标纠偏这个功能,因为国家安全需要,不允许使用国际标准的地球坐标系,也并不是咱们这边这样,很多国家都是这样处理的,就是本国的地图经纬度坐标都是按照国家标准来的,所以就需要一个转换。国内主要有三种坐标系,国际标准用的地球坐标系WGS-84,国家标准用的火星......
  • 分享一个五年级时制作的游戏(C++)
    游戏名称《mediocre》是一个纯文字类型的游戏,由于当时不会使用图形库,所以没有任何图像进入游戏后会有一些无关紧要的弹窗公告蓝窗启动界面(伪) 关闭弹窗后会显示一段时间的游戏LOGO之后就进入游戏界面了,附带一段简陋的剧情(大概就是冒险时不幸失联)游戏中的人物有生......
  • C++趣味实验之:设计一个模拟公司运营的程序(极简版)
    根据剩余价值理论,设计一个模拟公司运营的程序原理非常简单: (此公式为企业扩大再生产的基本规律)同理,我们可以利用C++来实现这个操作,这就需要使用递归函数doublen,c,sum1,d1,z1;cout<<"输入启动资金(万元):"<<endl;cin>>n;intb;cout<<"输入市场劳动力数目:"<<endl;ci......
  • C++笔记4•类和对象3•
    1.初始化列表(1)构造函数再理解:classDate{public:Date(intyear,intmonth,intday){  _year=year;  _month=month;  _day=day;}private:int_year;int_month;int_day;};上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其......
  • 2024华为OD机试真题-启动多任务排序(C++/Python)-C卷D卷-200分
    2024华为OD机试题库目录(Python、C++)-(C卷+D卷)-CSDN博客目录题目描述输入描述输出描述用例1题目解析代码c++python题目描述一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。......