1.首先要知道C++兼容C的语法,学习C对于C++的帮助很大
2.第一个C++代码
#include<iostream>
//类比C语言的头文件
using namespace std;
int main() {
cout << "hello world!\n" << endl;
return 0;
}
2.1关键字namespace(命名空间)具体含义:
命名空间是一个 ‘域’ 和C语言的作用域的域差不多,可以把一些变量或者函数包含在里面,主要用来解决C语言的一些命名缺陷(冲突)问题。
2.2
C语言中的定义不能是关键字,比如
int long = 0;
这个定义就是错误的,因为int和long都是C语言中的关键字。
2.3
但是库函数的名称就可以定义,比如这段代码就可以编译成功
int main() {
int scanf = 10;
int strlen = 20;
return 0;
}
接着往下看这段代码,如果copy到VS上,就发现会报错的
int main() {
int scanf = 10;
int strlen = 20;
scanf("%d", &scanf);
printf("%d", scanf);
printf("%d", strlen);
return 0;
}
分析错误:命名冲突
int main() {
int scanf = 10;
int strlen = 20;
//调库函数 取地址,使用上面的初始化
scanf("%d", &scanf);
//报错:项不会计算为接受 2 个参数的函数
printf("%d", scanf);
printf("%d", strlen);
return 0;
}
因为就近原则,使用scanf的时候,不会去全局找,再因为局部优先的原因,会先到局部找,这个问题C解决不了。
回到C++
C++有命名空间可以用来解决这个问题
//命名空间, 名称
namespace ABC {
int scanf = 10;
int strlen = 20;
//内容
}
用‘域’把这两个包含了,不会和其它的冲突
使用方法:
namespace ABC {
int scanf = 10;
int strlen = 20;
}
int main()
{
//默认访问局部或者全局
printf("%x\n", scanf);
printf("%x\n", strlen);
//指定访问ABC命名空间的
// :: 域作用限定符
printf("%x\n", ABC::scanf);
printf("%x\n",ABC::strlen );
return 0;
}
还可以定义函数:
namespace adc {
int add(int left, int right){
return left + right;
}
}
int main() {
adc::add(1, 2);
return 0;
}
使用方法2:嵌套命名空间,使用的较少,但是很有意义
namespace adc {
//函数1
int add(int left, int right){
return left + right;
}
//嵌套的函数2
namespace acd {
int sub(int left, int right) {
return left - right;
}
}
}
int main() {
adc::add(1, 2);
adc::acd::sub(12, 2);
//格式也不一样
return 0;
}
命名空间在一个工程里面可以定义多个
名字为NO.1的头文件
可以在cpp文件调用
总结:同一个工程中在不同的文件中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
3:
C++为了防止命名冲突,把自身库里面的东西都定义在一个名为std(标准库)的空间中
要使用标准库中的东西有三种方法:
3.1. 指定命名空间
较为麻烦,每个使用的地方都要指定,但是最规范
#include<iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
3.2.懒人必备法
直接展开std,整个文件都可用,但是会使自己定义的和库定义的冲突了,变得和C一样了
在工程中不推荐,自行练习无所谓
#include<iostream>
using namespace std;
int main() {
cout << "hello world" << endl;
}
3.3.对部分常用的展开,一种1和2折中的方案,也会经常用
#include<iostream>
using std::cout;
using std::endl;
int main() {
cout << "hello world" << endl;
return 0;
}
4.C++的输入和输出
先不深入了解,往后会讲,先记住它的使用
cout——是ostream输出类型全局对象
cin——是istream输入类型的全局对象
endl——是一个全局的换行符号
int main() {
//1——控制台
//2——输入
//3——不是必须的
// 1 2 3
std::cout << "hello world" << std::endl;
// 1. ↑ 2.借助<< 流向↓
// ↑ ← ← ← ↓
return 0;
}
4.1对比C语言的scanf和printf的区别是—— 自动识别类型
int main() {
int a = 10;
int* P = &a;
//C
printf("%d,%p\n", a, P);
//C++
std::cout << a << "," << P << std::endl;
//相当于scanf
//从控制台输入,流向a
std::cin >> a;
printf("%d,%p\n", a, P);
return 0;
}
原理涉及到函数重载和运算符重载,后面会讲
5.缺省参数:
缺省参数是声明或定义函数时,为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参
#include<iostream>
using namespace std;
// 函数 参数
void lostnumber(int a = 0) {
cout << a << endl;
}
int main() {
lostnumber(20);
lostnumber(10);
lostnumber(0);//默认
return 0;
}
5.1全缺省参数 :参数全部给有缺省值
缺省又叫做 :初始值,参数值,缺省值
//全缺省参数
// 缺省值
void lostnumber1(int a = 10, int b = 20, int c = 30) {
cout << a << endl;
cout << b << endl;
cout << c << endl << endl;
}
int main() {
lostnumber1();//没传
//结果为初始值10,20,30
lostnumber1(1);//传1个
//结果1,20,30
lostnumber1(1, 2);//传2个
//结果1,2,30
lostnumber1(1, 2, 3);//全传
//结果1,2,3
return 0;
}
5.2 半缺省参数
必须从右往左缺省,并且是连续的
//半缺省参数
void lostnumber2(int a, int b = 10, int c = 20) {
cout << a << endl;
cout << b << endl;
cout << c << endl << endl;
}
int main() {
//不能不传参数,最少为1
lostnumber2(1);
//1,10,20
lostnumber2(1, 2);
//1,2,10
lostnumber2(1, 2, 3);
//1,2,3
return 0;
}
作用 :调用变得更灵活,以后会细讲,先不纠结
注意事项:缺省参数必须是常量,(变量的情况有些复杂,不纠结)
缺省参数不能在函数声明和定义同时出现(.h 和.cpp)