文章目录
- 命名空间
- C++输入与输出
- 缺省参数
- 函数重载
命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标 识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
#include<stdio.h>
#include<stdlib.h>
int rand = 0;
int main()
{
printf("%d\n",rand);
return 0;
}
这也证明了C语言并不能避免重定义这类问题,所以接下来我们要解决的事情就是重命名问题。
解决重命名问题有三种方法
- 1.指定命名空间访问
- 2.常用部分展开
- 3.全局展来(并不常用)
指定命名空间访问
这类方法会在以后的实际开发的项目工程种经常使用,但是并不方便日常练习。
#include<stdio.h>
#include<stdlib.h>
#include"zzm1.h"
int a = 0;
int main()
{
int a = 5;
printf("%d\n",a);//5
printf("%d\n",::a);//0
printf("%d\n",Azzm::a);//10
return 0;
}
//头文件zzm1.h
namespace Azzm
{
int a = 10;
}
定义命名空间,需要使用到
namespace
关键字,后面跟命名空间的名字,然后接一对{}
即可,{}
中即为命名空间的成员。命名空间是可以嵌套的,当两个命名空间的名称是一样的编译器会认为将两个命名空间合并成为一个。命名空间中可以定义变量/函数/类型
从上面的代码中可以看出,查找
a
的信息是从函数内开始找的,没有找到再去全局中查找。::
(作用域限定符)就是指定空间查找的,当::
的前面没有东西,或者为空格时,意思就是指定的空间为全局,在::
的前面加上Azzm
就是去该名字的命名空间去查找。
-------------------------------------------------------------------------------------------------------------
常用部分展开
该方法在以后的实际开发项目当中也会经常的使用,但是并不适合平时的练习。
#include<iostream>
//using namespace std;
using std::cout;
using std::endl;
int main()
{
int a = 0;
cout<<a<<endl;
cout << "hello world" << endl;
cout << 'c' << endl;
return 0;
}
部分展开可见上面的代码已经方便多了,
-----------------------------------------------------------------------------------------------------------
全局展开
该方法经常使用于平时的练习,非常的便利,但是并不适合实际开发当中的项目。
#include<iostream>
using namespace std;
//using std::cout;
//using std::endl;
int main()
{
int a = 0;
cout<<a<<endl;
cout << "hello world" << endl;
cout << 'c' << endl;
return 0;
}
全局的展开,同样也带来了命名与函数名的冲突问题,有利也有弊。
一般情况下是不建议全局展开的。
C++输入与输出
- 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
- cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
- <<是流插入运算符,>>是流提取运算符。
- 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
- 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有一个章节更深入的学习IO流用法及原理。
注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用+std的方式。
#include<iostream>
using namespace std;
int main()
{
int n=0;
cin >> n;
double arr[5];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
for (int i = 0; i < n; i++)
{
cout << arr[i] << endl;//endl='\n'
}
return 0;
}
使用
cout
和cin
的好处是它可以自动识别类型,方便了很多。当需要控制浮点数精度的时候,可以继续使用scanf
,相对于这两个控制精度更加的简便(c++
是兼容c
的)。所以在我们使用时,那种更方便就是用那种,都是取决于自己。
缺省参数
缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
void Func(int a = 0)//默认值a=0
{
cout<<a<<endl;
}
int main()
{
Func(); // 没有传参时,使用参数的默认值
Func(10); // 传参时,使用指定的实参
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;
}
- 半缺省参数
void Func(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
注意:
- 半缺省参数必须从右往左依次来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现(在声明当中出现)
//test.cpp
#include"test.h"
int main()
{
Func(1);
return 0;
}
//test.h
#include<iostream>
using std::cout;
using std::endl;
void Func(int a = 10, int b = 20, int c = 30);//注意
//zzm.cpp
#include"test.h"
void Func(int a , int b, int c )//注意
{
cout << "a = " << a << endl;//1
cout << "b = " << b << endl;//20
cout << "c = " << c << endl;//30
}
- 缺省值必须是常量或者全局变量
- C语言不支持(编译器不支持)
函数重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
形成函数重载有三种不同的条件,符合其一就可以实现函数重载。
- 参数类型不同
- 参数个数不同
- 参数顺序不同
1.参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
2.参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
3.参数顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
在这里简单介绍一下c和c++分别的识别函数的方法,c是直接就通过函数名来识别,所以c也就不能出现相同的函数名在统一作用域。而c++是通过函数名和参数来识别函数的,所以也就可以实现相同的函数名,返回类型并不能作为识别函数的方法。
最后:文章有什么不对的地方或者有什么更好的写法欢迎大家在评论区指出 |