【C++杂货铺】C++介绍、命名空间、输入输出

这篇具有很好参考价值的文章主要介绍了【C++杂货铺】C++介绍、命名空间、输入输出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++杂货铺】C++介绍、命名空间、输入输出,C++,c++,开发语言

一、C++前言介绍

1.1 什么是C++?

 C语言是结构化模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计

1.2 C++的发展史

 1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。
 语言的发展就像是练功打怪升级一样,也是逐步递进,由浅入深的过程。我们先来看下C++的历史版本。
【C++杂货铺】C++介绍、命名空间、输入输出,C++,c++,开发语言
 C++还在不断的向后发展。但是:现在社会上主流使用还是C++98C++11,所有重点要把C++98和C++11掌握好,随着对C++理解不断加深,有时间可以去琢磨下更新的特性。

二、C++关键字

 C++一共有63个关键字,如下所示:
【C++杂货铺】C++介绍、命名空间、输入输出,C++,c++,开发语言

三、命名空间

3.1 为什么要有命名空间?

 大型程序一般会使用多个独立开发的库,这些库又可能定义大量的全局变量的名字,如类、函数和模板等。当程序用到多个供应商提供的库时,不可避免地会发生某些名字相互冲突地情况。多个库将名字放置在全局命名空间中将引发命名空间污染(namespace pollution)。
 为了解决上面的问题,于是提出了命名空间的概念,命名空间分割了全局命名空间,其中每一个命名空间是一个作用域是一种空间概念,常见的域有:局部域、全局域、类域、命名空间域,域会影响访问生命周期

3.2 命名空间定义

 一个命名空间的定义包含两部分:首先是关键字namespace,随后是命名空间的名字。在命名空间名字后面是一系列由花括号括起来的声明和定义。只要是能出现在全局作用域中的声明就能置于命名空间内,主要包括:类、变量(及其初始化操作)、函数(及其定义)、模板和其他命名空间(这意味着命名空间可以嵌套):

namespace wcy//命名空间的名字
{
	//定义变量
	int rand = 10;
	//定义函数
	int Add(int left, int right)
	{
		return left + right;
	}
	//定义类型
	struct Node
	{
		struct Node* next;
		int val;
	};
	//嵌套命名空间
	namespace N2
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

 上面的代码定义了一个名为wcy的命名空间,该命名空间包含有变量、函数、类型、命名空间。和其他名字一样,命名空间的名字也必须在定义它的作用域内保持唯一,如果在同一个作用域中出现多个相同名字的命名空间,编译器最后会把他们合并,这意味着命名空间可以是不连续的。命名空间既可以定义在全局作用域内,也可以定义在其他命名空间中,但是不能定义在函数或类的内部
小tips:
 命名空间作用域后面无须跟分号。

3.3 每一个命名空间都是一个作用域

 和其他作用域类似,命名空间中的每个名字都必须表示该命名空间内的唯一实体。因为不同命名空间的作用域不同,所以在不同命名空间内可以有相同名字的成员
 定义在某个命名空间中的名字可以被该命名空间内的其他成员直接访问,也可以被这些成员内嵌作用域中的任何单位访问。位于该命名空间之外的代码则必须通过域作用限定符::明确指出所用的名字属于哪个命名空间

namespace wcy
{
	int a = 10;
}

int a = 30;

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

【C++杂货铺】C++介绍、命名空间、输入输出,C++,c++,开发语言
 上面的代码在局部域、全局域、wcy命名空间域中分别定义了一个a变量并且赋了不同的值,在没指定作用域的时候,会根据局部优先的原则去访问局部变量;::a的左边什么也没有意味着去全局域中查找;wcy::a则指定了要到wcy这个域里面去查找。

3.4 命名空间的使用方法

命名空间有以下三种使用方法:

  • 加命名空间名称以及作用域限定符
int main()
{
    printf("%d\n", wcy::a);
    return 0;    
}
  • 使用using将命名空间中某个成员引入
using wcy::b;
int main()
{
    printf("%d\n", wcy::a);
    printf("%d\n", b);
    return 0;    
}
  • 使用using namespace 命名空间名称 引入

 可以用using namespace wcy将命名空间展开,把命名空间中的成员提升到包含命名空间本身和using指示最近的作用域。

namespace wcy
{
	int a = 10;
	int b = 5;
	int c = 100;
}

int a = 30;

using namespace wcy;

int main()
{
	printf("%d\n", a);//a不明确,出现二义性
	printf("%d\n", ::a);//正确:访问全局的a
	printf("%d\n", wcy::a);//正确:访问wcy中的a
	printf("%d\n", b);//正确,去访问wcy中的b
	int c = 89;//当前局部变量的c隐藏了wcy::c
	c++;//当前局部的c设置成90
	return 0;
}

 以上面的代码为例,通过usingwcy命名空间展开,这个过程相当于把wcy中的名字“添加”到全局作用域中,这使得程序可以直接访问wcy中的所有名字。
 当命名空间被注入到它的外层作用域之后,很可能该命名空间中定义的名字会与其外层作用域中的成员冲突。例如在主函数中,wcy的成员a就与全局作用域中的a产生了冲突。这种冲突是允许存在的,但是要想使用冲突的名字,我们就必须明确指出名字的版本main函数中所有未加限定的a都会产生二义性错误。
 为了使用像a这样的名字,我们必须使用作用域运算符来明确指出所需的版本。我们使用::a来表示全局作用域中的a,而使用wcy::a来表示定义在wcy中的a
因为main的作用域和命名空间的作用域不同,所以main内部的声明可以隐藏命名空间中的某些成员的名字。例如,局部变量c隐藏了命名空间的成员wcy::c。在main中使用c不存在二义性,他指的就是局部变量c。

3.5 嵌套的命名空间

 嵌套的命名空间同时是一个嵌套的作用域,它嵌套在外层命名空间的作用域中。嵌套的命名空间中的名字遵循的规则与往常类似:内层命名空间声明的名字将隐藏外层命名空间声明的 同名成员。在嵌套的命名空间中定义的名字只在内层命名空间中有效,外层命名空间的代码想要访问它必须在名字前添加限定符。

namespace wcy
{
	int a = 10;
	namespace wcy1
	{
		int a = 900;//将外层作用域的a隐藏了
		int d = 1000;
	}
	//int b = d;//不正确:d是未声明的标识符
	int b = wcy1::d;//正确访问的是wcy1里面的d

	namespace wcy2
	{
		int f = wcy1::d;//正确
	}
}

int main()
{
	printf("%d\n", wcy::wcy2::f);
	printf("%d\n", wcy::wcy1::a);
	printf("%d\n", wcy::a);
	return 0;
}

3.6 C++标准库的命名空间

std是C++标准库的命名空间,C++将标准库的定义实现都放到这个命名空间中。
std命名空间的使用惯例:

  • 在日常练习中,建议直接用using namespace std即可,这样很方便。
  • 在项目开发中由于代码较多、规模大,就很容易出现冲突问题,所以建议指定命名空间去访问或者使用using把常用的名字引入。

四、C++输入和输出

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
	cout << "Hello C++" << endl;
	return 0;
}

代码说明:

  • 使用cout标准输出对象(控制台)cin标准输入对象(键盘)时,必须包含头文件以及按命名空间使用方法使用std。
  • cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,它们都包含在头文件中。
  • <<是流插入运算符,>>是流提取运算符。
  • 使用C++的输入输出更加方便,不需要像printf和scanf输入输出那样,需要手动控制格式。C++的输入输出可以自动识别变量类型(本质上是运算符重载),但cout和cin的效率比较低。
  • 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些我将在后面逐一分享给大家。

注意:
 早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需要包含了对应的头文件即可,后来将其实现在std命名空间下,为了和C的头文件区分,也为了正确使用命名空间,规定C++的头文件不带.h。有一些旧编译器中还支持<iostream.h>格式,现在一些新的编译器已不再支持,因此推荐使用<iostream>配合std的方式。


 今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是春人前进的动力!
【C++杂货铺】C++介绍、命名空间、输入输出,C++,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-593267.html

到了这里,关于【C++杂货铺】C++介绍、命名空间、输入输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++杂货铺】内管管理

    目录 🌈前言🌈 📁 C/C++中内存分布 📁 new 和 delete的使用 📁 new 和 delete的优点 📁 new 和 delete的原理  📂 operator new 和 operator delete函数  📂 内置类型  📂 自定义类型 📁 内存泄漏 📁 总结         欢迎收看本期【C++杂货铺】,本期内容讲解C++内存管理。包含了C++中内存

    2024年04月14日
    浏览(32)
  • 【C++杂货铺】详解string

    目录  🌈前言🌈 📁 为什么学习string 📁 认识string(了解) 📁 string的常用接口  📂 构造函数  📂 string类对象的容量操作  📂 string类对象的访问以及遍历操作​编辑  📂 string类对象的修改操作 📁 模拟实现string 📁 总结         欢迎观看本期【C++杂货铺】,本期内容

    2024年03月20日
    浏览(30)
  • 【C++杂货铺】运算符重载

    本文将以日期类为基础,去探寻运算符重载的特性与使用方法,下面先给出日期类的基础定义: 备注 :拷贝构造函数和析构函数,均可以不写,因为当前日期类的三个成员变量都是内置类型,没有动态申请空间,使用浅拷贝就可以。 📖 如何比较两个日期的大小? 现如今,

    2024年02月16日
    浏览(54)
  • 【C++杂货铺】详解list容器

    目录 🌈前言🌈 📁 介绍 📁 使用  📂 构造  📂 迭代器iterator  📂 capacity  📂 modifiers  📂 迭代器失效 📁 模拟实现  📂 迭代器的实现 📂 代码展示 📁 和vector的区别 📁 总结         欢迎收看本期【C++杂货铺】,本期内容将讲解STL中关于list的内容,会分为一下几个方

    2024年04月14日
    浏览(35)
  • 【C++杂货铺】缺省参数、函数重载

     缺省参数是 声明或定义函数时为函数的参数指定一个缺省值 。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。  上面代码在 fun 函数的形参部分给了缺省值10,这意味着在调用 fun 函数的时候可以传参,也可以不传参,如果传参了那形参

    2024年02月16日
    浏览(25)
  • 【C++杂货铺】初识类和对象

    📖 面向过程 C语言是 面向过程的 ,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。以洗衣服这件事为例,下图是C语言完成洗衣服这件事的过程。 📖 面向对象 C++是 基于面向对象的 ,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完

    2024年02月16日
    浏览(36)
  • 【C++杂货铺】string使用指南

    2024年02月14日
    浏览(32)
  • 【C++杂货铺】再谈类和对象

    在创建对象的时候,编译器通过调用构造函数,在构造函数体中,给对象中的各个成员变量一个合适的初值。 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初

    2024年02月16日
    浏览(25)
  • 【C++杂货铺】探索string的底层实现

    string 本质上是一个动态顺序表,它可以根据需要动态的扩容,所以字符串一定是通过在堆上动态申请空间进行存储的,因此 _str 指向存储字符串的空间, _size 用来表示有效字符数, _capacity 用来表示可以存储有效字符的容量数。 注意 :默认构造函数需要注意的地方是:首先

    2024年02月11日
    浏览(27)
  • 【C++杂货铺】详解 stack 和 queue

            欢迎收看本期【C++杂货铺】,本期内容将讲解C++STL中stack和queue的内容,其中包含了stack , queue,priority_queue是什么,怎么使用以及模拟实现这些容器。         此外,还将将讲解设计模式中的适配器模式,以及STL中stack,queue的底层deque。         stack是一种容器适配

    2024年04月12日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包