初始C++(一)

目录

前言:

命名空间:

总结:


前言:

        C语言学好了,现在当然要进阶了,那么就是从C++开始。

        C++兼容C,支持其中90%的语法。可能有很多同学听说过C#,C#和C没有关系,是微软研究出来对标Java的语言。

        C++有63个关键字。

命名空间:

        我们之前使用C语言,其实有很多缺陷,比如从命名开始,就有缺陷,因为在全局变量中,我们不能使用相同的名字,否则会报错,此时我们的本贾尼大佬就开始增强C语言的可读性和实用性,添加了命名空间。举个栗子:

        注意此时没有包含stdlib.h头文件,就没有报错。

        这是C++文件,因为也支持C语言,当我们包含了stdilib.h头文件以后,就发生了报错。这是因为,我们引用头文件就相当于把头文件展开,stdlib.h头文件中有rand这个全局变量,我们又定义了一个全局变量,所以就会报重定义的错误。

        这其实也就是C语言的缺陷。

        但是我们知道,一个项目可能由100或更多的人来完成,我们最后都要合并为一个项目,但是我们不可能保证每一个人的命名都不一样。

        为了解决这个问题,我们要使用namespace(命名空间)。

#include<stdio.h>
#include<stdlib.h>
namespace bit 
{
	int rand = 0;
}


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

        可以发现我们此时打印的是头文件中的rand变量。 

        但是此时我们就像使用命名空间中的变量该怎么办?不同域可以定义同名变量,但是当我们全局和局部都有相同的的变量名时,我们该如何去访问全局变量呢?

int a = 2;

int main()
{
	int a = 1;
	printf("局部变量 a = %d\n", a);
	printf("全局变量 a = %d\n", ::a);
	//此时 :: 前面没有任何语句,相当于默认访问全局变量

	return 0;
}

         当我们定义了命名空间,在前面加上命名空间名即可访问。

#include<stdio.h>
#include<stdlib.h>
namespace bit 
{
	int rand = 0;
}

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

        编译器默认查找规则:1.当前局部域 2.全局变量。

        我们可以这样理解,当我们要去地里摘菜时,一定是先去自己家中找(就相当于局部域),之后如果没有了,就去村中野地去找(就相当于全局域);如果还没有,就真的找不到了。

        命名空间如果指定,就相当于去隔壁张大爷家的菜地中摘,张大爷指定了可以免费拿。

        在一个项目当中,多个文件中允许存在相同的命名空间,当使用时会进行合并。

        当命名空间合并以后,就不能有同名的内容了或者嵌套定义才可以。

展开命名空间:

        当我们要频繁用到一个命名空间中的一个变量时,就会要写很多代码,此时就需要用到一个语法:using namespace 命名空间名。

        这叫做展开命名空间。

namespace bit 
{
	int c = 0;
}

//展开命名空间
using namespace bit;

int main()
{
	printf("%d\n", c);


	return 0;
}

         当我们展开了命名空间后,此时编译器默认查找规则会多出来一个,就是局部没找到到全局找,全局没找到到展开命名空间找。

        但是我们不能随意展开命名空间,比如:

namespace ss
{
	int c = 0;
}

namespace bit 
{
	int c = 0;
}

//展开命名空间
using namespace bit;
using namespace ss;

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

         就像上面,此时就不知道去找谁。

         使用命名空间的3种方式:

  1. 指定访问
  2. 全展开
  3. 指定展开某一个
namespace bit 
{
	int c = 0;
}

//指定展开某一个
using bit::c;

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

        以上就是指定展开命名空间中的某一个。 

        C++标准库为了防止和你定义的名字冲突,它标准库中的一些东西包在了命名空间中,所以我们还是要指定或者展开。

        其中cout就是输出,c是console控制台;endl相当于换行。

#include<iostream>
//IO流

int main()
{
	//<< 流插入
	int i = 0;
	double j = 1.11;
	//其自动识别类型
	cout << i << " " << j << '\n' << endl;
	//其中endl也是换行
	return 0;
}

        我们需要做出一下修正:

std::cout << i << " " << j << '\n' << std::endl;

         这些东西会包在一个std的命名空间中,所以我们要指定命名空间。

         此时我们就可以展开官方的std命名空间。

using namespace std;//全部展开并不好
using std::cout;//展开指定某一个
using std::endl;
#include<iostream>
//IO流
using namespace std;//全部展开并不好



int main()
{
	int i = 0;
	cin >> i;//流提取,不需要取地址
	cout << i;
	return 0;
}

        cin是流提取,相当于scanf但是不需要取地址。

        如果我们不习惯,因为C++支持C语言,所以我们也可以使用printf和scanf,但是以后还是建议使用cout和cin。

        我们可以发现我们刚才引入的iostream头文件没有加上.h,C++可以不用带.h。当然仅限C++头文件,不包括C的头文件,所以C的头文件还是要带上.h。

缺省参数:

        C++支持在函数中提供缺省参数。

using namespace std;

//缺省参数
void Func(int a = 1)
{
	cout << a << endl;
}

int main()
{
	Func();
	Func(2);
	return 0;
}

         我们也可以提供全缺省函数:

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

int main()
{
	F2(1, 2, 3);
	F2(1, 2);
	F2(1);
	F2();

	return 0;
}

        必须按照顺序传,不能跳跃着传输。

        我们也可以半缺省:

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

int main()
{
	F3(1);//至少要传入一个
	F3(1, 2);
	F3(1, 2, 3);

	return 0;
}

        其实缺省参数用处用很多,比如当我们要初始化一个栈时,我们不知道要初始化多大空间时就可以使用官方的值,也可以参入参数。

        缺省参数不能声明和定义同时给。

总结:

        今天就到这,加油各位!

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值