首页 > 编程语言 >【初识C++】(关键字,命名空间)

【初识C++】(关键字,命名空间)

时间:2023-06-15 19:31:33浏览次数:50  
标签:int 作用域 C++ 关键字 初识 dzt printf 空间 命名

@TOC


一、C++中的关键字

【初识C++】(关键字,命名空间)_ci

二、命名空间

命名空间是对于全局变量来说,我们在定义变量或函数时,函数名可能会和库中的函数名产生冲突。

比如:

【初识C++】(关键字,命名空间)_命名空间_02

报错的意思是:库中存在rand这个函数,而我又定义一个rand这个变量,所以会产生名字的冲突。

为了解决这个问题,C++引入了命名空间这个概念。

而与该命名空间的关键字是:namespace

1.命名空间规则

命名空间搜索规则:局部域->全局域->命名空间域(如果不指定,不会主动去搜索)

首先引入域的概念,学习c语言会知道,有一个域叫做作用域,比如局部作用域和全局作用域。来看下面的代码:

int a = 10;

int main()
{
	int a = 0;

	return 0;
}

我分别要输出局部作用域的a和全局作用域的a该如何输出?

使用域作用限定符

域作用限定符是: "域名+::" ,两个冒号。比如这样:

int a = 10;

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

对于全局作用域来说,想要获取a,直接在a前面加上两个冒号即可,全局域的域名可以省略。

访问命名空间域的方法:1.展开命名空间域

看下面的代码:

namespace dzt
{
	int a = 5;
}

//int a = 10;

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

这样的代码,假如要输出a,是不行的,编译器报的错误是:”未声明的标识符“

【初识C++】(关键字,命名空间)_ci_03

所以我们想要获得命名空间域的内容,

using namespace dzt;

我们把这句代码加入到命名空间dzt下面就可以执行了。这句代码的意思是:展开我的命名空间域dzt。

【初识C++】(关键字,命名空间)_作用域_04

此时编译不会出现问题。

展开命名空间域 和 #include 的区别

在编译过程中:

展开命名空间域是编译器会去命名空间域搜索。

#include 是将包含的头文件的内容拷贝过来。

二者不同,注意区分。

方法2:指定命名空间对象

//命名空间后面跟名字,这个名字是随便起的。
namespace dzt
{
	int a = 5;
}

//int a = 10;

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

只需要使用 “域名::指定变量或函数” 这样的访问方式即可。

注意:对于命名空间域来说,展开了命名空间域后,相当于变成全局作用域了 比如:

int a = 10;

namespace dzt
{
	int a = 5;
}

using namespace dzt;

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

有一个全局变量a = 10,现在展开了命名空间域后,相当于全局域有a = 10 和a = 5,此时就会报a不明确的问题。

因为编译器不清楚这个a 到低是全局作用域的a还是命名空间域的a。

可以理解成,命名空间域就像是一堵围墙,一旦展开,相当于把围墙拆掉,围墙内的所有东西便会暴露出来。

总结:不要轻易展开命名空间域。

还有一个需要注意的点:

在不同的文件中创建相同名字的命名空间域,会自动将这些名字相同的命名空间域合并。

2.正确使用命名空间

上面讲过了如何使用命名空间的两种方法。这里重述一遍:** 1.使用using namespace 命名空间名称 引入 2.加命名空间名称及作用域限定符 3.使用using将命名空间中某个成员引入**

在之后的学习中,推荐使用第二种和第三种的结合

比如:

namespace dzt
{
	// 命名空间中可以定义变量/函数/类型
	int a = 0;
	int b = 1;

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

	struct Node
	{
		struct Node* next;
		int val;
	};
}

using dzt::a

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

在一个命名空间域中,定义了多个变量和结构体以及函数。我们想访问该命名空间域的内容时,尽量不使用完全展开的方法,可以指定搜索某个变量即可。

总结:命名空间的出现是为了解决c语言的命名冲突问题。

三、C++中的输入和输出

C++中使用cout来进行输出,cin进行输入。比如:

#include<iostream>
//引入库的头文件,该头文件包含cin,cout等关键字
using namespace std;
//让编译器可以去库里面搜索

int main()
{
	double a = 10;
	//cin包括但不限于scanf
	//  >>是流提取运算符
	cin >> a ;
	//cout包括但不限于printf
	// <<是流插入运算符
	cout << a << endl;
	return 0;
}

在C++中的cin和cout是会自动识别类型的,关于如何自动识别,涉及到函数重载问题,后续会讲到。

由于C++是包含C的,所以cin和cout这种输入输出的效率会比C低一点点,因为cin和cout会自动识别类型,涉及到更复杂的实现。

在不同的情况下,可以cin,cout,scanf,printf结合使用。

标签:int,作用域,C++,关键字,初识,dzt,printf,空间,命名
From: https://blog.51cto.com/u_15818575/6494239

相关文章

  • C++学习(二)
    拷贝构造函数对象1=对象2:默认的拷贝构造函数1#include<iostream>2usingnamespacestd;34structPerson{5intage;6stringname;7};89intmain(){10Personp1={10,"张三"};11cout<<"age:"<<p1.......
  • C++学习(三)
    static静态修饰的变量,必须先声明,再实现,例如1classPerson{2public:3starticintage;4starticinitAge(){5//运行异常6age=10;7}8}91011正确写法12classPerson......
  • C++学习(四)
    对象继承1#include<iostream>2usingnamespacestd;34classPerson{5public:6intage;7char*name;8Person(char*name,intage){}9};10//类默认是私有的11//public:公开继承,不加public会导致main()函数中student.age无法引用......
  • 初识k8s,安装k8s,kubesphere一键安装
     1.轻量级的容器系统是是现在的主流,但一个成熟的项目可能需要成百上千的应用(容器)来支撑,如此一来,大量分布在不同服务器上的容器就靠人工就非常难以管理,而Kubernetes的出现就是为了解决这个问题,它将大量的容器编排管理起来。 2.容器编排系统角逐历史mesosapache分布式资......
  • C/C++《数据结构》课程设计指导书[2023-06-15]
    C/C++《数据结构》课程设计指导书[2023-06-15]《数据结构》课程设计指导书适用专业:计算机2022级编写人:李玉龙2023年5月《数据结构》课程设计指导书一、设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;2.初步掌握软......
  • C/C++器材信息管理系统[2023-06-15]
    C/C++器材信息管理系统[2023-06-15]使用C++程序设计语言,完成一个项目,项目名为:器材信息管理系统,要实现的功能如下,且每项功能具有数据校对验证:1、实现新器材的录入,包括器材的名称、录入日期、购买价钱等信息;2、当有器材借用需求时,进行借用登记,主要流程为:查询器材数量,若库存数量大......
  • [问题解决]:ImportError: /home/test/anaconda3/envs/py39/bin/../lib/libstdc++.so.6
    报错(py39)test@test:~/code/Face/test_speed$pythonface_yaw_pitc_roll.pyTraceback(mostrecentcalllast):File"/home/test/code/Face/test_speed/face_yaw_pitc_roll.py",line17,in<module>importdlibFile"/home/test/anacon......
  • 探秘C#中的yield关键字
    在"C#中,什么时候用yieldreturn"中,我们了解到:使用yieldreturn返回集合,不是一次性加载到内存中,而是客户端每调用一次就返回一个集合元素,是一种"按需供给"。本篇来重温yieldreturn的用法,探秘yield背后的故事并自定义一个能达到yieldreturn相同效果的类,最后体验yieldbreak的用法......
  • 《深入探索C++对象模型》- 第一章 - 关于对象 - 笔记
    额外负担:主要由virtual引起1.1C++对象模式简单对象模型(ASimpleObjectModel)Objectptr1->Data1ptr2->Function1ptr3->Function2ptr4->Data2……表格驱动对象模型(ATable-drivenObjectModel)ObjectDatamembertableptrMemberfunctiontab......
  • 1688通过API接口按关键字搜索商品
    作为阿里巴巴旗下的B2B平台,1688无疑是商家在寻找商品时的绝佳选择。同时,平台也提供了一系列API接口,方便开发人员或商家通过编写代码实现按关键字搜索商品。本文将重点介绍如何通过API接口在1688中按关键字搜索商品。以下是具体的步骤:第一步:获取应用AppKey和AppSecret在使用A......