自学内容网 自学内容网

【C++】入门基础(命名空间、缺省参数、函数重载)

目录

一.命名空间:namespace

1.namespace的价值

2.namespace的定义

3.namespace的使用方法

3.1 域解析运算符::

3.2 using展开

3.3 using+域解析运算符

二.输入输出

三.缺省参数

四.函数重载

1.参数类型不同

2.参数个数不同

3.参数顺序不同


一.命名空间:namespace

1.namespace的价值

在C/C++中,存在大量变量、函数,它们的名称都存在在全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,避免命名的冲突。

2.namespace的定义

使用namespace关键字定义一个域,这个域跟全局域各自独立,不同的域中可以定义相同名字的变量,这就避免的命名的冲突。其中C++标准库都放在一个叫std(standard)的命名空间中。例如以下代码:同一个名的变量rand在不同域中表现不同的内容

TIPs:cout<<  <<endl相当于C语言中的printf(" \n");

#include<iostream>
#include<stdlib.h>
using namespace std;

namespace zyh
{
int rand = 10;
}

int main()
{
//默认是std::rand
//标准库中rand是一个地址
cout << rand << endl;
//命名空间zyh中rand是一个Int变量
cout << zyh::rand << endl;
return 0;
}

 ​​​​

C++中域有局部域,全局域,命名空间域,类域;局部域、全局域会影响编译查找逻辑和变量的生命周期,但命名空间域和类域不会影响变量的生命周期。

namespce只能定义在全局中,并且支持嵌套定义。项目工程文件中多文件中定义的同名namespace会被认为是一个namespace,自动合并到一起。

//嵌套定义
namespace zyh
{
int rand = 10;

namespace zyh2
{
int rand = 20;
}
}

3.namespace的使用方法

3.1 域解析运算符::

在变量名前加上(命名空间名) + :: (域解析运算符)就可以访问指定命名空间域中的变量了,例如:

namespace zyh
{
    int a = 10;
    int b = 20;
}

int main()
{
    //访问命名空间域zyh中的a和b
    cout<<zyh::a<<endl;
    cout<<zyh::b<<endl;
    return 0;
}

3.2 using展开

using + (命名空间名);直接将命名空间内的所有成员全部展开,也就是说展开后无需加域解析运算符就可访问,但这种方式风险极大,不推荐在项目中使用,例如:

namespace zyh
{
    int a = 10;
    int b = 20;
}

//直接使用using展开命名空间zyh
using namespce zyh;
int main()
{
    /展开后就能直接访问命名空间域zyh中的a和b
    cout<<a<<endl;
    cout<<b<<endl;
    return 0;
}

3.3 using+域解析运算符

这就是前两者的结合版,将命名空间域中的某个成员进行展开使用,这种方式是比较合理的,也经常使用到,例如cout和endl是std命名空间中的输出和换行,由于经常要用到,因此可以在程序最开头直接将这两个成员进行展开,此后方便使用。

using std::cout;
using std::endl;

int main()
{
    int a = 10;
    cout<<a<<endl;
}

二.输入输出

C++的输入输出相较于C语言就舒服多了,C++不需要自己手动输入格式,它能自动识别变量的类型(本质是通过函数重载实现的)并进行输入输出。

  1. <iostream>是input,output stream的缩写,是标准输入、输出流库,定义了标准的输入、输出对象
  2. std::cin相当于scanf,配合流插入运算符>>,实现数据的输入
  3. std::cout相当于printf,配合流输出运算符<<,实现数据的输出
  4. std:endl相当于换行(此时可以这么理解)
using std::cout;
using std::endl;
using std::cin;
int main()
{
    int a;
    double b;
    char c;
    
    //不同类型的abc,cin和cout都能自动识别处理
    cin >> a;
    cin >> b;
    cin >> c;

    cout << a << "/" << b << "/" << c << endl;

    return 0;
}

三.缺省参数

有些地方缺省参数也叫做默认参数,它是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定的实参,则采用该形参的缺省值,否则就使用指定的实参。

全缺省就是全部形参都给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。原因很好理解,就是为了防止歧义,例如4个参数中只有第一个和最后一个有缺省值,那么若给的实参有3个,应该如何分配?为了应对这些情况,C++特意做出的规定。

函数声明和定义分离的时候,缺省参数不能在函数声明和定义中同时出现,否则就会出现歧义,规定必须函数声明给缺省值。

//全缺省
void func1(int a = 10, int b = 20, int c = 30)
{
cout << a << "/" << b << "/" << c << endl;
}

//半缺省
void func2(int a, int b = 0, int c = 0)
{
cout << a << "/" << b << "/" << c << endl;
}

int main()
{
func1();
func1(666);
func1(1, 2, 3);

func2(6);
func2(6, 7, 8);
return 0;
}

四.函数重载

C++支持在同一作用域下出现相同的函数名,区别在于这些同名函数的形参不同,这个不同,可以是参数个数,参数类型,或参数顺序。C语言是不支持同一作用域中出现同名函数的,这一改动就是为了方便使用,更加灵活。

1.参数类型不同

int Add(int a, int b)
{
return a + b;
}

double Add(double a, double b)
{
return a + b;
}

int main()
{
cout << Add(3, 4) << endl;
cout << Add(1.1, 2.2) << endl;

return 0;
}

2.参数个数不同

int Add(int a, int b)
{
return a + b;
}

int Add(int a, int b, int c)
{
return a + b + c;
}

3.参数顺序不同

实际上也就是参数类型不同

void f(int a, double b)
{
cout << "f1" << endl;
}

void f(double b, int a)
{
cout << "f2" << endl;
}

int main()
{
f(1, 1.2);
f(2.2, 4);

return 0;
}

注意:返回值不能最为函数重载的条件,因为调用函数的时候无法区分,因此只能将参数的区别作为函数重载的依据 


原文地址:https://blog.csdn.net/2301_80555259/article/details/140359903

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!