
C++兼容C语言绝大多数的语法,所以C语言实现的hello world依旧可以运行,C++中需要把定义文件的代码后缀改为.cpp,VS编译器看到是.cpp就会调用C++编译器编译,linux下要用g++编译,不再是gcc


当然C++有一套自己的输入输出,C++版本的hello world是下面这么写的

C语言的第一个不足就叫命名冲突

编译的时候,预处理阶段头文件会展开,没包含头文件#include<stdlib.h>的时候只有一个变量rand,包含了它之后,头文件内还有一个叫rand的函数,下面打印的时候编译器就不知道使用的是哪个rand了
虽然这里稍微改一下变量名就可以正常输出了,而在一个公司内部,一个项目多达几百w行代码,而这么多的代码量肯定是由很多人写的,这样的情况下两个人起的名字冲突概率还是很大的,于是就出现了命名空间来解决这个问题
C/C++对命名定义的规定是在同一作用域下,不能定义同名变量,反之
这里用printf访问a,会优先访问局部域的a,这是因为局部优先原则

如果这里想要访问全局的a,就要使用::运算符(域作用限定符号)了,有了它就可以指定访问作用域了,如果域作用限定符左边没东西,默认的就是全局
而想要访问命名空间里的rand,就要在域作用限定符左边加上域的名字

这里报错的原因是,第三个printf默认访问了全局的rand,rand是个函数名,是个指针,而指针要用%p打印,把%d改为%p即可
且其不会默认的从局部到全局再到命名空间去搜索,在没有指定的情况下,默认是不会去命名空间中进行搜索的

所以总结下来就是:编译器语法查找确认,默认先局部查找,再全局查找,找不到就报错。 如果制定了作用域,就直接去这个域查找,没有找到就报错
如果想用命名空间里的类型去定义一个变量,是定义不了的,想定义bit要加在Node前面,因为主体定义的是Node


但是如果数据库组的业务量很大,有10个人负责这一部分的代码,那他们之间也可能有命名冲突的问题,所以就可以嵌套命名空间。如果命名空间也冲突了,那只有改名字了,不过这样相比C语言那样的全局命名冲突的概率就小很多了

上面的情况都是在同一个文件下,但是在实战中,一个项目的代码都是在很多个文件里的,下面看一下多文件情况下的冲突问题
如图现在这些数据结构命名冲突了
stack.h

Queue.h

也就是在声明和定义分离的时候,虽然Queue.h和Queue.cpp里的命名空间在不同文件里,但是会合并成一个
所以说之前的数据结构的文章内我都带了名词前缀,在这样的情况下就不需要带名词前缀了,直接使用命名空间就可以了
Queue.h

Stack.h

Queue.cpp

Stack.cpp

test.c

可以看到也是可以正常跑起来的
这里举个例子,现在要使用C++的排序,就包含图中的头文件,这个头文件就叫算法,下图的算法sort底层就是快排,直接在参数传数组开始的地址,和结束的地址(结束的地址不是7,而是最后一个数据的下一个位置)


这样也有一个防止命名冲突的效果
编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。一般使用命名空间中定义的变量/函数,有三种方式:
可以认为using namespace std这里的std是展开库里面std的命名空间,之后用库里面的东西就不需要指定了

比如说< iostream >里的东西是用namespace std包含起来的,using namespace std就相当于头文件里包含的东西就到全局了。这里默认找cout是从局部和全局查找,加了using namespace std的意思就是,如果现在局部全局都没找到cout,还会到展开的命名空间中去查找

意思就是cin和sort直接去std中去寻找,而cout和endl就相当于直接暴漏在全局了

不过少部分常用的全部展开之后,自然就不能定义和展开同名的东西了


如图本质上没有匹配上,就相当于报错了
补充一下,在用C++打ACM/蓝桥杯一些竞赛的时候,输入输出在前面的时候会加下面几行代码可以提效率
#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;
}因为OJ分为两种,一种是IO型一种是接口型。



这里语法编译就无法通过







这个程序在没有缺省参数的情况下是设计的不够好的,比如说初始化的时候,n很大的时候就需要不断扩容,这就需要性能的消耗(扩容需要开空间,拷贝,释放旧空间)
此时就需要对SLInit函数进行改造,增加一个参数n,这样初始化就可以开辟n个数据大小的空间,控制顺序表初始化的大小,这样就起到一个优化的作用


还有一种情况,当不知道插入多少数据,就可以使用缺省参数,默认开4个数据大小的空间



还有一种情况,比如说这里顺序表中要查找数组中所有的4
5 4 6 3 4 7 4按照之前的顺序表只能查找出第一个4的下标 这个解决方法用半缺省就可以了 加了一个半缺省之后,就不是每次都从0位置开始查找了,这里就每次都从i位置开始查找,没有找到return -1



这样默认想从0位置查找,就可以不传i这个参数
C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的

C++可以通过参数匹配去自动识别,所以C++比C写的更爽

接下来两种情况函数重载就有问题了

本来C++的基础语法准备用一篇文章写完的,结果发现细节太多了,相比C的细节翻了一倍,干脆分两篇来写了,喜欢博主的文章不要忘记一件三联支持一下哦~