文章目录

前言C++有何过C之处?C++中的关键字命名空间✈️为什么要引入命名空间?✈️命名空间的定义✈️如何使用命名空间中的内容呢?

C++中的输入和输出✈️C++标准库的命名空间✈️输入输出头文件

C++缺省参数✈️缺省参数定义✈️缺省参数的分类✈️缺省参数只能出现在函数声明中

前言

铁子们好啊!这是阿辉新开的专栏《拿下C++》的第一篇文章,本文主要带大家了解一下C++,带大家从C语言过渡到C++,所以大家首先要有C语言的基础,否则后面的内容你可能会异常懵逼。不会C语言的铁子,这里推荐各位先看阿辉的专栏《爱上C语言》(点击即可跳转,自荐一下嘛 ) 不多bb好吧,让我们迈向C++的世界!!!

本篇文章仅为C++向C语言过渡的第一篇,后续会持续更新相关内容,阿辉不会去讲C++的发展史,阿辉旨在让铁子们快速入门C++,对于c++发展史感兴趣的铁子可以自行研究 

C++有何过C之处?

首先,我们都知道C++这门编程语言是在C语言的基础上发展而来的,他名字也是由此而来,C++是完全兼容C语言的,怎么理解呢?C语言相当于是C++的真子集,C++包含了C语言的所有特性和语法规则,并且可以直接调用C语言的函数和库,也就是说C语言的代码在C++的环境下同样可以编译运行,用ven图表示如下 铁子们或许都听过C++是面向对象的语言,这个怎么理解呢?好的这个咱们先不理解 ,因为我也不知道,my teacher告诉我学完C++你就懂了,好的铁子们咱们也学完C++在懂,提前懂了显得咱欺负人 

C++中的关键字

C++中的69个关键字包含C语言中的32个关键字

关键字关键字关键字关键字关键字关键字关键字关键字asmelsenewthisautoenumoperatorthrowboolexplicitprivatetruebreakexportprotectedtrycaseexternpublictypedefcatchfalseregistertypeidcharfloatreinterpret_casttypenameclassforreturnunionconstfriendshortunsignedconst_castgotosignedusingcontinueifsizeofvirtualdefaultinlinestaticvoiddeleteintstatic_castvolatiledolongstructwchar_tdoublemutableswitchwhiledynamic_castnamespacetemplatenullptrtypeidoverridealignasfinalchar16_t

这些关键字不认识没关系,也不需要去背,用熟了自然就会了 

命名空间

✈️为什么要引入命名空间?

C++引入了命名空间的概念,以便更好地组织和管理代码。为啥呢?

大型程序一般会使用多个独立开发的库,这些库又可能定义大量的全局变量的名字,如类、函数和模板等。当程序用到多个供应商提供的库时,不可避免地会发生某些名字相互冲突地情况。 这个时候我们将每一个库都装起来,用的时候再拿出来用,既能保证命名不会冲突,又能在需要时使用

命名空间分割了全局命名空间,其中每一个命名空间是一个作用域。域是一种空间概念,常见的域有:局部域、全局域、类域、命名空间域,域会影响访问和生命周期

✈️命名空间的定义

首先,定义命名空间需要使用namespace这个关键字,然后在namepace后面跟上命名空间的名字和一对花括号{},花括号里面放的是命名空间内的变量、函数、类等的定义和声明,命名空间也可以嵌套定义 切记命名空间花括号后无分号 下面我们来展示一个例子:

//下面这个tmh命名空间嵌套了一个命名空间tzh

namespace tmh//命名空间的名字

{

//定义变量

int a = 10;

//定义函数

int Add(int left, int right)

{

return left + right;

}

//定义类型

struct Node

{

struct Node* next;

int val;

};

//嵌套命名空间

namespace tzh

{

int c;

int d;

int Sub(int left, int right)

{

return left - right;

}

}

}

注意

命名空间的名字可以重复,这种重复并非两个不同的命名空间,而是在编译过程中将相同名字的命名空间合并,事实上还是一个命名空间 命名空间不能在类和函数中定义

✈️如何使用命名空间中的内容呢?

这里我们引入一个操作符::作用域限定符,怎么使用呢?我们接着看

命名空间的名字+::+命名空间内的变量、函数、类型等等 例子:

int main()

{

printf("%d\n", tmh::a);//上面的例子中的命名空间tmh

return 0;

}

使用using将命名空间中某个成员(局部展开) 例子:

using tmh::Node;//将定义的结构体Node展开在全局域中

int main()

{

Node a;//用Node创建变量

return 0;

}

使用using namespace 命名空间名称引入(全局展开) 可以用using namespace tmh将命名空间展开(意味着在整个文件中都可以直接访问该命名空间中的函数、变量等),把命名空间中的成员提升到包含命名空间本身和using指示最近的作用域 例子:

namespace tmh

{

int a = 10;

int b = 5;

int c = 100;

}

int a = 30;

using namespace tmh;

int main()

{

printf("%d\n", a);//这种写法是错误的,因为全局中定义了a,命名空间tmh中的a也展开在了全局域

printf("%d\n", ::a);//正确:访问全局的a,::左边空白表示全局域

printf("%d\n", tmh::a);//正确:访问tmh中的a

printf("%d\n", b);//正确,去访问tmh中的b

int c = 89;

c++;//当前局部的c设置成90,局部变量优先,没有特别的指示优先使用局部域中的元素

return 0;

}

C++中的输入和输出

✈️C++标准库的命名空间

C++与C语言不同,在C++中标准库的定义和声明是分开的 std是C++标准库的命名空间,C++将标准库的定义实现都放到这个命名空间中 而将声明放在单独存放在各自的头文件中 std命名空间的使用惯例:

在日常练习中,建议直接用using namespace std即可,这样很方便在项目开发中由于代码较多、规模大,就很容易出现冲突问题,所以建议指定命名空间去访问或者使用using把常用的名字引入

✈️输入输出头文件

C++中输入输出:

使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间使用C++输入输出更方便,不需增加数据格式控制,比如:整形–%d,字符–%c ostream (输出流)类型全局对象,istream (输入流)类型全局对象 ,endl全局的换行符号<<是流插入运算符,>>是流提取运算符使用C++的输入输出更加方便,不需要像printf和scanf输入输出那样,需要手动控制格式。C++的输入输出可以自动识别变量类型(本质上是运算符重载),但cout和cin的效率比较低

给铁子们直接上代码:

struct Person

{

char name[10];

int age;

};

int main()

{

std::cout << "C++ ";

std::cout << "C++ " << std::endl;

//cout与cin对比C语言printf\scanf 来说可以自动识别类型(函数重载+运算符重载)

int a = 10;

int* p = &a;

printf("%d,%p\n", a, p);

std::cout << a << "," << p << std::endl;

char str[100];

std::cin >> str; //cin不用&

std::cout << str << std::endl;

struct Person P = { "tmh", 20 }; //格式化输出printf比cout好

printf("name:%s age:%d\n", P.name, P.age);

std::cout << "name:" << P.name<<" age:"<< P.age << "\n";

}

输入:

tmhazjy

输出:

C++ C++

10,0xffff4860

10,0xffff4860

tmhazjy

name:tmh age:20

name:tmh age:20

C++缺省参数

✈️缺省参数定义

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参(缺省就是默认,没给函数传参就用默认的)

void TestFunc(int a = 0)

{

cout << a << endl;

}

int main()

{

TestFunc(); // 没有传参时,使用参数的默认值

TestFunc(10); // 传参时,使用指定的实参

}

✈️缺省参数的分类

半缺省参数

void test1(int a, int b = 10, int c = 20)

{

cout << "a = " << a << endl;

cout << "b = " << b << endl;

cout << "c = " << c << endl;

}

半缺省参数必须从右往左依次给缺省值,即:第一个形参和第二个形参给了缺省值,而第三个形参没有给缺省值,这种情况是不被允许的。也不能隔着给,即:第三个形参和第一个形参给了缺省值,而第二个形参没有给缺省值,这种情况也是不被允许的

全缺省参数

void test2(int a = 10, int b = 20, int c = 30)

{

cout << "a = " << a << endl;

cout << "b = " << b << endl;

cout << "c = " << c << endl;

}

顾名思义就是每一个参数都设置缺省值

✈️缺省参数只能出现在函数声明中

为了避免出现不一致的情况,要求缺省参数不能在函数声明和定义中同时出现,并且只能出现在函数的声明中 why?

因为在预处理阶段会把头文件展开,一般函数的声明就放在头文件中。如果只在函数的定义中给了缺省值,那头文件展开后,函数的声明语句中并没有缺省参数,此时如果在调用该函数的时候没有传参希望使用它的缺省值,那在程序编译的过程中就会出现问题,即:函数的声明没给出缺省值,意味着该函数需要参数

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是阿辉前进的动力!

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: