C++入门基础之命名空间、输入输出和缺省参数

目录
  • 一.命名空间
    • (1)命名空间的定义
    • (2)命名空间的使用
    • (3)全局域
  • 二.输入&&输出
    • (1) cout
    • (2)cin
    • (3)cin cout自动是识别类型
  • 三.命名空间的展开
    • (1)使用using namespace 命名空间名称引入
    • (2)使用using将命名空间中某个成员引入
  • 四.缺省参数
    • (1)缺省参数概念
    • (2)缺省参数分类
  • 五.最后

一.命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存

在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

例如:

#include<stdio.h>

int rand = 10;
int main()
{
	int a = 10;
	return 0;
}

这时候代码没有任何问题。

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

int rand = 10;
int main()
{
	int a = 10;
	return 0;
}

出现这个问题,我们知道,在头文件<stdlib.h>里面有一个函数rand(),所以头文件展开后就会出现定义冲突的现象。在C++中为了避免这种,利用命名空间。

(1)命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}
中即为命名空间的成员。

#include<stdio.h>

namespace ytt
{
	int a = 5;
}

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

这样就不会有定义冲突的问题了,那如果我们想访问,值为5的那个变量a,又要怎么办呢?

(2)命名空间的使用

如果直接访问是访问不到的。

1.访问方法

命名空间的名称 +  :: + 命名空间内的变量或者函数。

namespace ytt
{
	int a = 5;
	int Add(int a, int b)
	{
		return a + b;
	}
}
int main()
{
	printf("a=%d\n", ytt::a);
	printf("4+5=%d\n", ytt::Add(4 , 5));
	return 0;
}

 2.命名空间的嵌套

namespace ytt
{
	int Add(int a, int b)
	{
		return a + b;
	}
	namespace wq
	{
		int Max(int a, int b)
		{
			return a > b ? a : b;
		}
	}
}
int main()
{
	printf("Max=%d\n", ytt::wq::Max(10, 15));
	return 0;
}

嵌套的情况下,就是一层一层访问:

(3)全局域

访问全局域,只需要  :: +  全局变量

namespace ytt
{
	int a = 10;
}
int a = 5;
int main()
{
	int a = 1;
	//局部a
	printf("a=%d\n", a);
	//全局a
	printf("a=%d\n", ytt::a);
	//命名空间内的a
	printf("a=%d\n", ::a);
	return 0;
}

二.输入&&输出

C++的输入输出是函数:cin,cout,被包含在头文件 <iostream> 中。

(1) cout

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

<<是流插入运算符

有了前面,命名空间的学习,我们也就能看出来了,cout 也是被封装到命名空间 std里面的,endl 是封装在 std 里面的换行符,和 ' \n '是一样的。

(2)cin

#include<iostream>
int main()
{
	int a = 0;
	std::cin >> a;
	std::cout << "a = " << a;
    return 0;
}

>>是流提取运算符,cin 也是被封装到命名空间 std里面的。

实际上cout和cin分别是 ostream 和 istream 类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有一个章节更深入的学习IO流用法及原理。

(3)cin cout自动是识别类型

cin cout 相对于 C语言的scnaf printf,少了类型的修饰,所以在C++中,cin 和 cout是可以自动识别类型的。

int main()
{
	int a = 0;
	double b = 0;
	char c = 0;
	std::cin >> a >> b >> c;
	std::cout << a <<std::endl;
	std::cout << b << std::endl;
	std::cout << c << std::endl;
	return 0;
}

三.命名空间的展开

(1)使用using namespace 命名空间名称引入

我们在写程序的时候,有时候会发生,某个命名空间的变量名,函数名,经常被使用,我们每一次使用都要加上命名空间,会非常麻烦。所以我们使用using namespace 命名空间名称引入。

#include<iostream>
namespace ytt
{
	int a = 0;
	int b = 2;
}
using namespace ytt;
using namespace std;
int main()
{
	cout << a << endl;
	cout << b << endl;
    return 0;
}

这样使用就是将命名空间的所有定义全部展开,这样虽然使得我们不用每次都去包含命名空间,到那时也使得我们辛辛苦苦建立的命名空间也就没有了意义。因为都在这里展开了,就会发生定义相同的冲突。所以这种使用方法在企业开发时禁止的,我们平时练习代码时,为了方便可以使用。

(2)使用using将命名空间中某个成员引入

上述使用使用using namespace 将整个命名空间展开,会有造成冲突的可能,我们还可以将命名空间的某一成员引入。

#include<iostream>
namespace ytt
{
	int a = 0;
	int b = 2;
}
using ytt::a;
using ytt::b;
using std::cout;
using std::endl;
int main()
{
	cout << a << endl;
	cout << b << endl;
    return 0;
}

四.缺省参数

(1)缺省参数概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

#include<iostream>
using std::cout;
using std::endl;
void fun(int a = 10)
{
	cout << a << endl;
}
int main()
{
	fun();  //没传参数,使用缺省参数
	fun(100);//传了参数,就使用传的参数
	return 0;
}

(2)缺省参数分类

1.全缺省参数

void Func(int a = 10, int b = 20, int c = 30)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

调用时:

void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
int main()
{
	Func();         //true
	Func(1);        //true
	Func(1, 2);     //true
	Func(1, 2, 3);  //true
	Func(, 1, 2);   //error
    Func(1, , 3);   //error
	return 0;
}

带有缺省参数的函数,传参数时必须从左往右连续,不能跳着给参数。

2.半缺省参数

void Func(int a, int b = 10, int c = 20)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

3.注意:

1. 半缺省参数必须从右往左依次来给出,不能间隔着给

2. 缺省参数不能在函数声明和定义中同时出现

#include<iostream>

using std::cout;
using std::endl;
//函数声明
void Func(int a = 10, int b = 20, int c = 30);
int main()
{
	Func();         //true
	return 0;
}
//函数定义
void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

 3. 缺省值必须是常量或者全局变量

五.最后

到此这篇关于C++入门基础之命名空间、输入输出和缺省参数的文章就介绍到这了,更多相关C++命名空间、输入输出和缺省参数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++输入输出注意事项总结

    本文总结了C++输入输出的各种注意事项,对于C++初学者或C++程序员来说都有一定的借鉴参考价值.具体总结分析如下: 一.string类: 1.cin>>string时,遇到'\n'或者空格即停止,并且'\n'或空格仍留在输入里,即只读了一个单词或什么都没读,但string类自己处理好了空字符什么的.下一次再这样读的话会跳过换行和空格; 2.读一行到string里可用getline(cin,string),这个函数一直读直到遇到了'\n',注意这里getline()不是cin的类方法,cin表

  • C++ namespace命名空间解析

    目录 命名空间 namespace 命名空间的定义 1. 函数定义在命名空间里 2.对全局变量使用命名空间 3.命名空间的嵌套 4.using命名空间 5.命名空间里的结构体 命名空间 namespace #include<iostream> int rand = 0; int main() { printf("%d", rand); return 0; } 上述代码一定会出现以下情况: 原因: 自己定义的rand变量为某一库函数里面已经声明过的函数,意思就是你自己定义的东

  • C++命名空间实例解析

    命名空间是C++非常重要的概念,本文就以实例形式对其进行深入分析,具体内容如下: 通常来说,在C++中,命名空间(namespace)的目的是为了防止名字冲突.每个命名空间是一个作用域,在所有命名空间之外,还存在一个全局命名空间(global namespace),全局命名空间以隐式的方式声明,它并没有名字.在命名空间机制中,原来的全局变量,就是位于全局命名空间中(可以用::member的形式表示). 一.定义命名空间 1.每个命名空间都是一个作用域 和其他作用域类似,在命名空间中的每个名字必须

  • C++输入输出重定向方法示例

    重定向是什么 所谓重定向就是把某应用原来的操作对象改成别的.比如说,我这个程序原来是从键盘接收信息的,现在该从一个叫config.ini的文件中接收信息了:本来输出的信息都显示在屏幕上的,现在我不显示在屏幕上了,我要输出到result.txt文本中保存起来. 本文主要给大家介绍了关于C++输入输出重定向的相关内容,分享出来供大家参考学习价值,下面话不多说了,来一起看看详细的介绍吧 C++中流(stream)是一个对象,所以任何有流这种行为的对象也是流对象. 流主要分为三种类型: istream:

  • C++ 命名空间--namespace总结

    目录 定义 意义 名字空间的三种使用方法 匿名空间 名字空间嵌套 总结 定义 namespace 名字空间的名字{ 全局变量 类型定义 函数 } 意义 对于一个较大型的C++程序来说,需要由多个程序员相互协作编写,这样的情况下容易出现不同程序员在需要负责的程序部分使用相同名字的变量或函数,导致程序合并后出现问题.名字空间的作用,就是将不同程序员编译的程序放入相应的名字空间,每个名字空间相对独立,空间内的变量和函数名只局限于当前空间下,从而解决命名冲突的问题. 名字空间的三种使用方法 (1)作用域

  • C++中输入输出流及文件流操作总结

    本文实例为大家分享了C++中输入输出流及文件流操作笔记,供大家参考,具体内容如下 1.流的控制 iomanip          在使用格式化I/O时应包含此头文件.     stdiostream   用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序 2.类继承关系 ios是抽象基类,由它派生出istream类和ostream类, iostream类支持输入输出操作,iostream类是从istream类和ostream类通过多重继承而派生的类 类ifstream继承了

  • C++中基本的输入输出函数使用指南

    在C语言中是用printf函数进行输出,用scanf函数进行输入的.C++保留了C语言的这一用法. scanf函数一般格式是: scanf(格式控制, 输出表列) printf函数的一般格式是     scanf(格式控制, 输出表列) scanf(格式控制, 输出表列) [例]用scanf和printf函数进行输入和输出. #include <iostream> using namespace std; int main( ) { int a; float b; char c; scanf(

  • C++命名空间namespace的介绍与使用

    介绍 命名空间可以解决程序中的同名冲突,尤其大型项目多人开发中经常用到.比如我们使用C++的标准输出std::cout就使用了std命名空间. 语法: namespace XXX { class A { public: ... }; } //没有分号 在某些第三方库中是有namespace的,因此我们在使用这些库的时,要确定是否使用using namespace来解除名字前缀. 使用 #include <stdio.h> namespace XXX { class A { public: vo

  • C++中的命名空间详细介绍

    目录 命名空间的特性 声明命名空间和命名空间成员 全局命名空间 不连续命名空间 嵌套命名空间 using声明和using编译指令 命名空间别名 综合代码示例 总结 命名空间的特性 首先熟悉一下命名空间的两个概念. 声明区域:可以在其中进行声明的区域,如全局文件的声明区域是文件,函数内声明的变量声明区域为代码块.潜在作用域:潜在作用域从声明点开始,到其声明区域的结尾.因此潜在作用域比声明区域小,因为变了必须定义后才能使用.这两个概念通过下图很好理解,也是编程的常识. 声明命名空间和命名空间成员 可

  • C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)

    一.C++关键字 C++总共有63个关键字,在入门阶段我们只是大致了解一下就可,在后续博客中会逐渐讲解 二.命名空间 相信学过C++的同学,一定都写过下面这个简单的程序 #include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; return 0; } 我们先来看第二行代码,using namespace std , 这行代码是什么意思呢 ? 这里我们

  • C# 语言入门基础介绍

    目录 一..NET 体系结构 二.Hello world 三.类型和变量 四.程序结构 前言: C#(读作"See Sharp")是一种新式编程语言,不仅面向对象,还类型安全. 开发人员利用 C# 能够生成在 .NET 中运行的多种安全可靠的应用程序. C# 源于 C 语言系列,C.C++.Java 和 JavaScript 程序员很快就可以上手使用. 本教程概述了 C# 8 及更高版本中该语言的主要组件. C# 是面向对象的.面向组件的编程语言. C# 提供了语言构造来直接支持这些概

  • Oracle PL/SQL语言入门基础

    正在看的ORACLE教程是:Oracle PL/SQL语言入门基础.PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序. PL/SQL的优点 从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL

  • 微信小程序开发入门基础教程

    微信小程序开发入门基础教程 本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果. 开发准备工作获取微信小程序的 AppID 登录 https://mp.weixin.qq.com ,就可以在网站的"设置"-"开发者设置"中,查看到微信小程序的 AppID 了,注意不可直接使用服务号或订阅号的 AppID . 下载开发工具 下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/dow

  • Kubernetes(K8S)入门基础内容介绍

    Introduction basic of kubernetes 我们要学习 Kubernetes,就有首先了解 Kubernetes 的技术范围.基础理论知识库等,要学习 Kubernetes,肯定要有入门过程,在这个过程中,学习要从易到难,先从基础学习. 那么 Kubernetes 的入门基础内容(表示学习一门技术前先了解这门技术)包括哪些? 根据 Linux 开源基金会的认证考试,可以确认要了解 Kubernetes ,需要达成以下学习目标: Discuss Kubernetes. Lea

  • Spring入门基础之依赖注入

    目录 一.构造器注入 二.set注入 三.其他方式注入 (1)导入约束 (2)p命名注入 (3)c命名注入 一.构造器注入 在前几节已经做过了详细的说明讲解,我们先跳过 二.set注入 依赖注入 依赖: bean对象的创建以及管理都依赖于Spring IOC容器 注入: bean对象中的所有属性,都有容器进行注入 在前面我们已经见识过了 普通类型注入和 bean注入的方式,那么对于复杂类型List.数组类型.Map.Set属性等怎么进行注入呢? 我们先提供一个包含各种类型的实体类 Student

  • Vue 2.0入门基础知识之内部指令详解

    1.Vue.js介绍 当前前端三大主流框架:Angular.React.Vue.React前段时间由于许可证风波,使得Vue的热度蹭蹭地上升.另外,Vue友好的API文档更是一大特色.Vue.js是一个非常轻量级的工具,与其说是一个MVVM框架,不如说是一个js库.Vue.js具有响应式编程和组件化的特点.响应式编程,即保持状态和视图的同步,状态也可以说是数据吧:而其组件化的理念与React则一样,即"一切都是组件,组件化思想方便于模块化的开发,是前端领域的一大趋势. 2.内部指令 2-1.v-

  • AngularJs 60分钟入门基础教程

    AngularJs是一个不错的用于开发SPA应用(单页Web应用)的框架.单页Web应用(single page web application,SPA),就是只有一张Web页面的应用.浏览器一开始会加载必需的HTML.CSS和JavaScript,所有的操作都在这张页面上完成,由JavaScript来控制不同view在这个页面上的呈现.本文源于Youtube上一个不错的AngularJs的入门教程视频:AngularJS Fundamentals In 60-ish Minutes,主要讲解了

  • JavaScript入门基础

    JavaScript基本语法 1.运算符 运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=).算术运算符(+,-,*,/,++,--,%).比较运算符(>,<,<=,>=,==,===,!=,!==).逻辑运算符(||,&&,!).条件运算(?:).位移运算符(|,&,<<,>>,~,^)和字符串运算符(+). 可能很多人不知道&quo

  • python入门基础之用户输入与模块初认识

    一.注释 当前行注释:# 被注释内容 多行注释:""" 被注释内容 """ 二.用户输入 #!/usr/bin/env python #_*_coding:utf-8_*_ #name = raw_input("What is your name?") #only on python 2.x name = input("What is your name?") print("Hello "

随机推荐

其他