C++入门基础篇(1)

欢迎大家来到海盗猫鸥的博客——

断更许久,让我们继续好好学习吧!

目录

1.namespace命名空间

命名空间的存在价值:

命名空间的定义:

命名空间的使用:

2.C++输入输出函数

使用:

3.缺省参数

4.函数重载

结语:


1.namespace命名空间

命名空间的存在价值:

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的

简而言之,当同一个项目中存在多个名字相同的变量时,可以防止命名冲突或者名字污染,也可以便于区分。在大型项目的开发中可以说必不可少。

命名空间的定义:

namespace就是命名空间的关键字,在关键字后加上命名空间的名字,在加上{}来限定范围即可。

namespace hdmo
{
	int a = 1;
}

注意:命名空间最后的' } '后面不用加上' ; ',区别于结构体,和函数类似。

命名空间本质就是我们创建了一个域,区别全局作用域而独立,就像每一个函数都有一个作用域一样,每个函数里的参数作用域都在函数范围内。命名空间也同理,每个命名空间中的函数、变量等的作用域都在命名空间的限定范围内,需要通过调用命名空间才能使用,但需要注意的是,命名空间中的函数变量等,生命周期都是全局的

namespace只能在全局作用域下定于,也可以嵌套定义。

在同一个项目中,相同名字的命名空间会被认为是同一个命名空间。

namespace hdmo
{
	int a = 1;
}

namespace hdmo
{
	int b = 1;
}

此时两个hdmo表示的就是同一个命名空间

而C++的标准库就存放在了名叫std(standard)的命名空间中,以此防止和其他语言的函数冲突,这也是为什么C++的程序中为什么基本都包含了一个

using namespace std;

就是为了包含C++的标准库。

命名空间的使用:

由于命名空间是一个域,想要在外部使用其中的函数变量等内容时,就需要像结构体一样使用一个操作符来实现这个操作。

命名空间的调用操作符即为两个冒号 :: 

#include <stdio.h>

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

从输出结果我们可以知道:当::前面为空时,默认调用全局作用域的变量。

命名空间中的变量函数等,在使用时有三种方式:

1.单个访问:使用 :: 来单独访问一个命名空间中的变量或者函数,最安全的使用方式;

2.单个展开:使用using单独展开一个变量或者函数,展开后,其作用域就变为了全局作用域,不再受限于命名空间。推荐常用的在不冲突的条件下使用这种方式。

3.全展开:直接将指定的命名空间全部展开,在项目中不推荐使用,冲突风险较大,可以在小型的程序中使用(C++标准库的标准库就是全展开的,所以我们在使用cin和cout时,不需要在前面加上std::)

2.C++输入输出函数

在C语言中我们的输入输出语句分别为scanf和printf,C++也兼容C语言的输入输出语句,但也有自己的输入输出函数,即cin和cout。

要想使用cin和cout函数,就要包含<iostream>标准输入输出流库,并且要包含C++的标准函数库

#include <iostream>
using namespace std;

使用:

cin在使用时用' >> '来输入;

cout在使用时用’ << ‘来输出。

<<是流插⼊运算符,>>是流提取运算符(<<和>>在C语言中还表示左移和右移运算符)

#include <iostream>
using namespace std;
int main()
{
	int a = 0;
	cin >> a;
	cout << a << endl;
	printf("%d\n", a);
	return 0;
}

endl我们可以先简单理解为换行'\n';基础部分不做过多讲解,以后的学习中会补充。

上述代码我们可以看出,cin和cout没有像scanf和printf一样使用%d,%c等来控制变量的输入输出格式,这是因为cin和cout可以自动识别变量和数据的类型,这是相对方便的地方。

在VS2022环境中,上述代码中不包含<stdio.h>,也能使用scanf和prinf函数,这是因为在VS中<iostream>间接包含了<stdio.h>,所以可以直接使用,但在其他编译环境下可能就需要包含<stdio.h>。

在想要实现控制精度等操作时,推荐直接使用C语言的输入输出方法来实现,C++中想要实现这个操作反而会更麻烦。

需要注意的是,scanf和printf的速度相对于cin和cout是更快的,在竞赛中卡运行时长的题目中可以直接使用scanf和printf,而下面代码可以提高cin和cout的效率,但本篇先不做解释。

#include <iostream>
using namespace std;
int main()
{
	// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
	// 可以提⾼C++IO效率
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	return 0;
}

3.缺省参数

缺省参数就是在声明或者定义函数的时候给函数参数一个缺省值,当我们调用函数时,若缺省参数没有传值,就使用定义好的缺省值,若传值,就使用传递的值。

缺省参数分为全缺省和半缺省;全缺省就是全部形参都给缺省值,半缺省就是部分形参给缺省值。且C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。

#include <iostream>
using namespace std;
namespace hdmo
{
	//全缺省
	int Fun1(int x = 0, int y = 0)
	{
		return x + y;
	}
	//半缺省
	int Fun2(int x, int y = 0)
	{
		return x + y;
	}
}

int main()
{
	cout << hdmo::Fun1() << endl;//全缺省可以不传参
	cout << hdmo::Fun1(1) << endl;
	cout << hdmo::Fun1(1,1) << endl;
	/*
	cout << hdmo::Fun2() << endl;//半缺省不能不传参
	*/
	cout << hdmo::Fun2(2) << endl;
	cout << hdmo::Fun2(2,2) << endl;
	return 0;
}

上述代码结果为:

半缺省必须保证缺省参数从最右往左定义和定义连续性,普通参数在左,缺省参数在右。

4.函数重载

函数重载,即为同时存在多个函数名相同的函数,同一个函数名同时表示个多个函数,即为重载。

他们之间的区别由参数类型和数量来决定,和返回值类型无关,仅返回值类型不同的两个同名函数无法实现重载

#include <iostream>
using namespace std;
namespace hdmo
{

	int Add(int x, int y)
	{
		return x + y;
	}
	double Add(double x, int y)
	{
		return x + y;
	}
	double Add(int x, double y)
	{
		return x + y;
	}
	double Add(double x, double y)
	{
		return x + y;
	}
}
int main()
{
	using hdmo::Add;
	cout << Add(1, 1) << endl;
	cout << Add(1.1, 1) << endl;
	cout << Add(1, 1.1) << endl;
	cout << Add(1.1, 1.1) << endl;
	return 0;
}

结果为:

通过上述代码我们就可以看出,重载的使用可以使我们更加方便的使用函数。若在C语言中,要实现上述效果,就要使用四个不同的函数名定义四个函数,使用时区分使用,而C++中有了重载之后,我们就可以将所有的加法函数都统一为一个名字,使用时也不用区分,直接使用即可,非常方便。

结语:

本篇C++入门基础篇就先讲到这里,后序会继续讲解其他的入门基础知识,欢迎大家继续莅临指教。

有不足的地方大家可以私信或者评论区指出!

个人主页:海盗猫鸥-CSDN博客

这里是小鸥!我们下期见~(*¯︶¯*)~

        

相关推荐

  1. C++ 基础入门3.1:算数运算符

    2024-07-11 22:12:03       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 22:12:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 22:12:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 22:12:03       57 阅读
  4. Python语言-面向对象

    2024-07-11 22:12:03       68 阅读

热门阅读

  1. MySQL索引之索引类型

    2024-07-11 22:12:03       18 阅读
  2. 在 Linux 上安装 Miniconda

    2024-07-11 22:12:03       23 阅读
  3. 洛谷P7537-字典树+DFS

    2024-07-11 22:12:03       19 阅读
  4. SpringBoot使用@RestController处理GET和POST请求

    2024-07-11 22:12:03       19 阅读
  5. python的内置函数和模块(网安)

    2024-07-11 22:12:03       24 阅读
  6. (C++哈希02) 四数相加 赎金信

    2024-07-11 22:12:03       22 阅读
  7. 超详细Python教程——面向对象相关知识

    2024-07-11 22:12:03       16 阅读
  8. 2024前端面试每日一更——简述MVVM?

    2024-07-11 22:12:03       22 阅读
  9. 呼叫中心遭遇UDP攻击,如何快速恢复服务?

    2024-07-11 22:12:03       23 阅读