目录
一.C++的第一个程序
首先C++是可以完美兼容C语言的,所以想要打印出“Hello World!”,完全可以用C语言的那一套语法规则来实现,如下:
#include<stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
但这始终是C语言的啊,C++有自己的输入输出方式,如下:
#include<iostream>
using namespace std;
int main()
{
cout << "Hello Word!" << endl;
return 0;
}
二.命名空间namespace
2.1为什么会有namespace?
在C/C++语言中,变量,函数,类等,在对其命名时或者在一些大型项目中,难免会与标准库中的命名重复,那这个时候主函数调用他们的时候就会面临“到底调用哪一个?”的问题,以避免命名冲突或者名字污染,namespace关键字的出现就是针对这种问题的。
例如会出现的问题
rand在库函数中,是生成随机值的函数,但在主函数外面定义了全局变量rand,这时候就会报错,rand重复定义。
2.2 namespace的定义
1.定义命名空间需要用到关键字namespace,后面跟上空间的名字,最后在后面加上一对括号{},
括号内就可以定义变量/函数/类型。
这样就不会报错。
2.namespace的本质是定义一个域,一个与全局作用域不同域,而不同的域中的变量/函数等可以定义成同样的名字。
3.C++的域有函数局部域,全局域,命名域,类域,域影响的是在编译时语法查找一个变量/函数/类时的逻辑(定义和申明),所以有域隔离,重复命名就解决了。
4.namespace只能在全局域中定义,并且可以嵌套定义。
两个a是不同的。
用这样就可以访问。
5.另外,在多文件项目中,同名的namespace定义的域,会被认为是同一个域,不会发生冲突的情况。
6.C++标准库都放在叫std(standard)的命名空间中。
2.3命名空间的使用
1.指定命名空间访问
命名空间名::变量/函数/
2.using展开命名空间中某个成员
在主函数外展开变量a,在主函数类可以不用再额外展开。
3.using展开整个命名空间
上面用的这个其实就是第三种方法,展开全部,using namespace +命名空间名
三.C++输入&输出流
<iostream>是input output stream的缩写,是标准输入输出流的库,定义了标准的输入,输出对象
std::cin是istream类的对象,主要面向窄字符的标准输入流
std::cout是istream类的对象,主要面向窄字符的标准输出流
std::endl是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区
<<是流插入运算符,>>是流提取运算符(C语言中是位操作符)
C++输入,输出更加方便,不像C语言的printf和scanf函数一样需要手动指定变量的格式,C++的输入输出可以自动识别变量类型(实际上是函数的重载,下面就有提到)
cin/cout/endl都属于C++标准库,C++标准库都放在std的命名空间中,所以可以通过命名空间的使用方法用它们,平时可以直接使用using namespace std展开整个命名空间,但是实际的项目中是不建议这样做的
scanf和printf可以直接使用,是因为<iostream>中间接包含了<stdio.h>,这个主要是看编译器
// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
// 可以提⾼C++IO效率
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
四.缺省参数
缺省参数就是在函数的定义或申明时,为函数的参数赋一个默认值,在调用函数时,如果没有另外传参,则参数就是默认参数,缺省参数分为全缺省和半缺省。(缺省参数也叫作默认参数)
全缺省就是全部形参都给默认值,半缺省就是部分参数给默认值,但是给默认值只能从参数列表的右边依次给默认值,且不能跳跃给缺省值。
调用时只能从左往右依次给实参
函数的申明和定义分离时,缺省参数不能同时存在,规定只能在函数的申明时给缺省值
#include<iostream>
using namespace std;
void fun1(int a,int b)
{
cout << a+b <<endl;
}
void fun2(int a, int b)
{
cout << a + b << endl;
}
void fun3(int a=2, int b=2)
{
cout << a + b << endl;
}
void fun2(int a,int b=9);
int main()
{
fun1(1, 1);
fun2(1);
fun3();
return 0;
}
fun1是正常的函数;fun2是半缺省参数函数,传参赋值给形参a,b为默认参数;fun3是全缺省参数函数,不用传参,a,b为默认参数。
五.函数重载
函数内是同样的逻辑,只是形参的个数与数据类型不同时,C语言是麻烦的,通常是需要重新定义一个不同函数名的函数,如果这样的情况变多了,或者程序员在调用函数时不小心记错了对应的函数名那将会对最后的结果产生影响,C++是如何解决的呢?就是函数重载,但函数只是参数的个数和参数的类型不同时,在定义函数时可以只改变这两处,而不改变函数名,在调用时,程序会自己与其符合的函数匹配。
#include<iostream>
using namespace std;
int fun1(int a, int b)
{
cout << a + b << endl;
return a + b;
}
//参数类型不同
double fun1(double a, double b)
{
cout << a + b << endl;
return a + b;
}
//参数个数不同
int fun1(int a, int b,int c)
{
cout << a + b +c<< endl;
return a + b + c;
}
int main()
{
fun1(1,1);
fun1(1.1,1.1);
fun1(1,1,1);
return 0;
}