C++入门(前篇)

本章重内容
C++入门(前篇)_第1张图片

C++入门

  • 1.命名空间
  • 2. C++输入&输出
  • 3. 缺省参数

简单的说一下C++语言的出现是为了弥补C语言的不足
由于要补充的东西太多,所以就在C语言的基础上又出了C++
所以我认为学习C++的前提是你得懂C语言
C++中可以使用C的大部分语法
可以这样理解C++入门(前篇)_第2张图片
C++关键字:学习过C语言的同学们都知道关键字这个东西只有用了才能学的会,光靠讲它的作用,大家肯定也是一脸蒙。所以C++的关键字我这里就不作讲解了。

1.命名空间

先来看一段C代码

#include 

//全局变量
int a = 0;

int main()
{
	//局部变量
	int a = 1;
	printf("%d\n", a);

	return 0;
}

毋庸置疑这里会输出结果为: 1
那我们如果想要输出全局变量有没有办法呢?
答:C语言不可以,但C++有办法
C++代码如下

#include 
using namespace std;

int a = 0;

int main()
{
	int a = 1;
	printf("局部变量:%d\n", a);
	printf("全局变量:%d\n", ::a);
	return 0;
}

这个符号 :: 为作用域限定符。
变量名前单加一个 :: 意为全局变量
其实命名空间的主要作用是,防止变量、函数和类重命名
看如下代码:

#include 
#include 

int rand = 0;

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

又是C代码?没错我们的C++是兼容C的大部分语法的。
我们在全局变量中定义了一个rand变量,再在main函数中打印,看似没有什么毛病,实际上程序会报错。
因为中有个函数的名字也叫rand,可以生成随机数。
报错如下:
C++入门(前篇)_第3张图片
因为在正真的开发过程中是由很多的程序员一起来完成的,他们每个人都有自己要完成的任务,各自写代码时不知道别人的怎么命名的所以就有了namespace(命名空间),namespace关键字的出现就是针对这种问题的。

#include 
using namespace std;

namespace cx
{
	int a = 2;
}

int a = 0;

int main()
{
	int a = 1;
	printf("局部变量:%d\n", a);
	printf("全局变量:%d\n", ::a);
	printf("自定义命名空间变量:%d\n", cx::a);
	return 0;
}

C++入门(前篇)_第4张图片
注意一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
要访问命名空间中的变量只需要,命名空间名::变量名就可以了

namespace cx
{
	// 命名空间中可以定义变量/函数/类型
	int a = 5;
	int Add(int left, int right)
	{
		return left + right;
	}

	struct stu
	{
		char name;
		int age;
	};
}

在C++标准库里的东西,都在std里面。
比如刚刚我们c语言,不可以使用的rand在C++中就可以使用
C++入门(前篇)_第5张图片

namespace std
{
	//库里面的东西
}

要想使用C++库里面的函数就得加上它的空间名::
或者用using将空间域展开

//展开std中的所有东西
using namespace std;
//部分展开,展开个别
using std:: cout;
using std:: endl;

虽然可以全局展开但我们最好不要这样做,因为我们有时会不小心与库里面的函数、变量重名。只要局部展开一些常用的即可。

那大家看一下我们下面这段代码可以这样写吗?

namespace cx
{
	int a = 2;
}

int a = 3;

using cx::a;

答案是:不可以
当我们把我们定义的域展开了之后它就会与,全局变量里的冲突。
报错如下:
C++入门(前篇)_第6张图片

2. C++输入&输出

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
    以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
    iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型
#include 
#include 
//在平时自己练习的时候可以展开全局
using namespace std;

//写项目时要局部展开
//using std::cout;
//using std::cin;
//using std::endl;

int main()
{
	int a = 5;
	const char* arr = "abcde";
	//endl 等价于 '\n'
	cout << a << endl;
	cin >> a;
	cout << a << endl;
	cout << arr << endl;

	return 0;
}

C++入门(前篇)_第7张图片

3. 缺省参数

像这样在参数部分赋值的叫做缺省参数。

void Fun(int a = 5)
{
	cout << a <<endl;
}

那它的作用是什么呢?
答:如果我们调用该函数,没有传参,那么a就等于5
如果我们传了参数,那a就等于我们所传的参数

#include 
#include 
using namespace std;

void Fun(int a = 0)
{
	cout << a <<endl;
}

int main()
{
	int a = 5;
	//传递参数
	Fun(a);
	//没有传参
	Fun();
	return 0;
}

C++入门(前篇)_第8张图片
全缺省参数

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

半缺省参数

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

那缺省参数可以像下图这样吗?

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

int main()
{
	Func(3,4,5);
	return 0;
}

答案是不可以的
C++入门(前篇)_第9张图片
所以半缺省参数必须从右往左依次来给出,不能间隔着给。
那我们在些项目的时候,缺省参数是在含的声明是给呢,还是在函数的定义时给呢,还是两个都给缺省参数呢?
由下图代码:
C++入门(前篇)_第10张图片
C++入门(前篇)_第11张图片
C++入门(前篇)_第12张图片
大家觉得这样写可以吗?运行一下看结果。
C++入门(前篇)_第13张图片
图片中报错了,说是我们重定义了默认参数。
说明这样写是不可以的。

那我们把函数声明时的缺省参数去掉,观察一下结果。
C++入门(前篇)_第14张图片
结果正确。
那我们再把定义时的缺省参数去掉。
C++入门(前篇)_第15张图片
结果也是可以的。

上面我们时fun(1,2,3)赋值了如果不赋值呢?
C++入门(前篇)_第16张图片
我们先把声明时的缺省参数去掉,参看程序是否可以正常运行。
C++入门(前篇)_第17张图片
报错了,这是为什么呢?

知识补充
实际程序在运行期间是不会去运行头文件的,但头文件会在每个文件中展开相当于
C++入门(前篇)_第18张图片
所以把声明的部分引进来,在调用函数Func,发现我们声明的部分没有缺省参数,我们也没有传值,编译器就会报错。
所以我们最好在声明是给缺省参数
总结:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现,但最好在声明时给
  3. 缺省值必须是常量或者全局变量

你可能感兴趣的:(C++学习,c++,c语言,开发语言)