关于C++的入门基础
一.C++的程序初识
一.C++的程序初识
首先我们要知道在C++中兼容C语言的多种语法,所以在C语言里面实现的hello world 依旧可以运行,在C++中需要把定义文件的后缀改成.cpp,在vs编译器中看到.cpp为后缀会自动调用C++编译。
在C中:
#include<stdio.h>
int main()
{printf("hello word\n");return 0;
}
在C++中有自己的一套输入输出,严格来说C++中的应该改是下面类似代码:
#include<iostream>
using namespace std;
int main()
{cout << "hello word\n" << endl;return 0;
}
二. 关于命名空间
2.1关于namespace的价值
在后面我们学习C++过程中,后面变量, 函数等后面要学到的大量存在的类,因为这些变量,函数,类等都存在域全局作用域中,会导致很多的冲突,为了避免这种冲突,namespace就是为了针对这些问题出现的。
下面举一个在C++中存在命名冲突的问题,在这里引入namespace 就是为了更好的解决这些问题
#include<stdio.h>
#include<stdlib.h>
int rand = 10;int main()
{printf("%d\n", rand);return 0;
}
这个函数会在此处报错:
因为编译器在查找的时候会默认从局部域查找再从全局域查找,这里局部域里面没有rand 但是全局域里面有两个rand ,所以就导致重定义的问题。
2.2关于namespace 的定义
1.定义命名空间,在这里需要用到namespace关键字,后面跟上命名空间的名字,然后跟上一对{},花括号里面是命名空间的成员,这里面可以定义变量,函数,类型等。
2,namespace本质是定义出一个域,这里需要注意的是,域里面不属于全局变量,不同的域可以定义同名变量,所以这样rand就不会冲突了。
3。在C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
4.namespace只能定义在全局,还可以嵌套定义。
5.在多文件中namespace重名不会冲突
6.C++标准库都存在std的命名空间中
::这个操作符是域作用限定符,指定访问某个域里面的,还要注意namespace只能定义在全局,不能定义在局部。
//关于正常的命名定义
//bitter是命名空间的名字,一般开发项目名字做
//命名空间
namespace bitter
{//命名空间可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
int main()
{//这里默认是访问的全局的rand 函数指针printf("%p\n", rand);//这里访问的是指定bitter命名空间中的randprintf("%d\n", bitter::rand);return 0;
}
命名空间还可以嵌套:
//命名空间还可以嵌套
namespace bitter
{//小王namespace wang{int rand = 1;int Add(int left, int right){return left + right;}}//小李namespace li{int rand = 4;int Add(int left, int right){return left + right;}}
}
int main()
{printf("%d\n", bitter::wang::rand);printf("%d\n", bitter::li::rand);printf("%d\n", bitter::wang::Add(2,3));printf("%d\n", bitter::li::Add(4,5));return 0;
}
需要注意的是,多文件中定义同名namespace,他们会默认合并在一起,就像同一个namespace一样,这里就不演示了,感兴趣的可以自己调试着看一下
2.3命名空间使用
编译查找一个变量的声明/定义实习,默认智慧在局部域查找或者查找,不会到命名空间里去查找,所以使用命名空间中的定义的变量/函数,有三种方式:
1.指定命名空间访问,项目中推荐
2. using将命名空间中的某个成员展开,项目中经常访问不存在冲突的成员推荐这种方式,比如using bitter ::STpush;
3.展开命名空间中的全部成员,但是在项目中不推荐这种方式,冲突的风险很大,日常联系为了方便推荐使用: using namespace bitter;
代码演示:
namespace bitter
{int a = 0;int b = 2;
}
int main()
{//这里编译器会报错,显示未定义标识符printf("%d\n", a);return 0;}//这里需要指定命名空间访问
int main()
{printf("%d\n", bitter::a);return 0;
}//下面是using 将命名空间的某个成员展开
using bitter::b;
int main()
{printf("%d\n", b);printf("%d\n", bitter::a);return 0;
}//展开命名空间的全部成员
using namespace bitter;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}
三.关于C++的输入输出
1.<iostream>是标准输入输出任何类型对象
2.cout<<流插入(输出) cin>>流提取(输出)
3.endl在结果上相当于"\n",实际上是个函数
//这里输入输出可以自动识别类型
int main()
{int a = 5;double b = 2.3;char c = 'c';cout << a << " " << b << "c" << endl;
}int main()
{// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码// 可以提⾼C++IO效率ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);return 0;
}
四.关于缺省参数
缺省值是指声明或者定义函数时作为函数的参数指定的一个缺省值/这里需要注意缺省参数不能声明跟定义同时给,全缺省就是全部参数给缺省值,半缺省就是部分形参给缺省值。
这里需要注意C++规定版缺省参数必须从左往右依次连续给缺省值,不能间隔条约给缺省值,函数调用同上。在函数声明和定义分离时缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
void Func(int a = 8)
{cout << a << endl;
}
int main()
{Func();// 没有传参时,使⽤参数的默认值Func(5); //传参时,使⽤指定的实参return 0;
}//全缺省
void Func(int a = 8,int b=10)
{cout << a <<b<< endl;
}
int main()
{Func();return 0;
}//半缺省
void Func(int a = 8, int b = 10)
{cout << a << b << endl;
}
int main()
{Func(4);return 0;
}