c++入门基础
1️⃣命名空间
2️⃣输入&&输出
3️⃣ 缺省函数
4️⃣ 函数重载
简单的说下c++的头文件用#include;
我们可以发现会出现重命名的问题,c++为了处理这个c语言遗留下的问题引入了命名空间。
命名空间的定义:定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名
空间的成员。
第一种普通写法⬇️
命名空间除了这个基本的使用还可以多个嵌套。
第二种嵌套写法⬇️
namespace Tencent
{
namespace Tencent1
{
int a = 0;
void f()
{
printf("viod f(\n");
}
struct ListNode
{
int val;
struct ListNode* next;
};
}
namespace Tencent2
{
int a = 0;
void f()
{
printf("viod f(\n");
}
struct ListNode
{
int val;
struct ListNode* next;
};
}
}
第三种是出现多个命名空间名称一样的问题⬇️
编译器会将多个命名空间名称一样的合并在一起。
为了处理这个问题CPP引入namespace xxx;通过一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中,这样就可以避免上面多个命名空间冲突问题。
namespace Tencent
{
int f = 6;
int rand = 8;
int a = 21;
}
int a = 0;
int main()
{
int a = 1;
printf("%d\n", rand);
printf("%d\n", f);
printf("%d\n", Tencent::rand);
printf("%d\n", Tencent::f);
printf("%d\n", a);
printf("%d\n", Tencent::a);
return 0;
}
using namespace Tencent的意思是把Tencent命名空间定义的东西放出来。
如何输出里面的东西如上面代码的写法Tencen::rand;
还能这样
namespace HuaWei
{
namespace HuaWei1
{
struct Node
{
int val;
struct Node* next;
};
}
}
int main()
{
struct HuaWei::HuaWei1::Node n1;
n1.val = 99;
struct Tencent::Tencent1::Node n2;
n2.val = 21;
return 0;
}
将HuaWei里面的HuaWei1进行拆分一层拆一层。但是如果一直拆拆到最后就相当没有使用该命名空间。
#include<iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
//输入
cin >> a;
cin >> b >> c;
//输出
cout << a << endl;
cout << b << " " << c << endl;
return 0;
}
上面的std是c++库的命名空间。
使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。>>是流提取运算符,<<流插入运算符。<<end是换行
由于>>&&<<的使用使得cpp可以进行多个输入与多个输出并且不需要考虑类型。
定义:缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
如果实参有值传的实参,否则像图中第一个无实参的一样用的是形参的值。
缺省函数又分为全缺省参数与半缺省参数。
1.全缺省:
using namespace std;
void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl << endl;
}
int main()
{
TestFunc();
TestFunc(1);
TestFunc(1,2);
TestFunc(1,2,3);
return 0;
}
2.半缺省:
//缺省
using namespace std;
void TestFunc(int a, int b = 20, int c = 30)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl << endl;
}
int main()
{
TestFunc();
TestFunc(1);
TestFunc(1,2);
TestFunc(1,2,3);
return 0;
}
将代码对比,可以得出它俩的区别。
注意:
1. 半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现
3. 缺省值必须是常数或者全局变量。
4. 参数缺省值只能出现在函数的声明中,而不能出现在定义体中。
例:
void Foo(int x=0, int y=0); // 正确,缺省值出现在函数的声明中
void Foo(int x=0, int y=0) // 错误,缺省值出现在函数的定义体中 { … }
在 C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,即重载。
函数重载出现的理由有2个:
第一个1️⃣ 便于记忆,提高了函数的易用性。
第二个2️⃣类的构造函数需要重载机制。因为 C++规定构造函数与类同名,构造函数只能有一个名字。
c语言不支持重载理由是c语言调用时调用函数名,形参中的类型无法确定。CPP支持重载是因为调用的时候将函数名和形参类型也一同调用过去,这样编译器在相同函数名的情况下可以判断出哪个函数被调用。不然编译器和程序员都不知道哪个函数被调用。
CPP调用的指令
你会****发现前面一个zlf一样后面是函数类型的开头。这就验证了CPP调用的过程时包括了调用类型。这就是可以重载的原因。
c语言调用是:只有函数名被调用。所以不支持重载。
CPP为了能够使用c库使用了如下图的代码。该代码告诉编译器extern "c"声明的函数,是c库,要用c的方式去链接调用。
在《高质量的C C++编程》是这样说的:1.C++提供了一个 C 连接交换指定符号 extern“C”。2.C++编译器开发商已经对 C 标准库的头文件作了 extern“C”处理,所以我们可以用#include 直接引用这些头文件。
但是这边我们是引用了现对路径。