目录
1.命名空间
1.命名空间的定义和概念
2.命名空间的使用
命名空间样例:
1.加命名空间名称及作用域限定符
2.使用using将命名空间中某个成员引入
3.使用using namespace 命名空间名称引入
3.命名空间中的结构体当定义结构体时如何使用
编辑4.头文件与源文件中的命名空间重名会怎样?
2.C++输入&输出
3.缺省参数
1.缺省参数的概念
2.缺省参数的分类
1.全缺省参数
2.半缺省参数
4.函数重载
1.函数重载的概念
2.函数重载的使用:
3.注意:
使用样例:
执行结果:
2.函数重载的分类:
1.参数类型不同
2.参数个数不同
3.参数类型顺序不同
3.函数重载与缺省函数合并,编译不报错,调用会报错,不知道调用哪个
1.命名空间
C++为了避免变量、函数、类的名称发生冲突或名字污染,命名空间(namespace关键字)腾空而生。
1.命名空间的定义和概念
#include <iostream>
using namespace std;
namespace A{
int b = 10;
}
namespace B{
int b = 20;
}
int main()
{
printf("%d\n",A::b);
printf("%d\n",B::b);
//cout << A::b << endl;
//cout << B::b << endl;
}
A省有名叫b这个人,B省有名叫b这个人,A省的b10岁,B省的b20岁.
cout是console out 控制台输出、cin是控制台输入.
命名空间里的定义是属于全局变量,随程序的结束而销毁,不随函数的结束而销毁.
std是C++标准库的命名空间,C++将标准库的定义实现都放到这个命名空间中,其中有cout,cin等全局的类对象,具体内容期待C++类和对象.
命名空间可以理解为城墙,那么using namespace可以理解为拆掉城墙,如果不拆掉std的城墙,cout需要写成std::cout和std::endl,麻烦!
当然平常练习时可以拆掉整个std城墙,对于写大项目时拆掉城墙意味着可能会出现命名冲突,这时就需要using std::cout 和 using std::cin 这样单独拆小城墙不影响命名发生冲突.
所以拆城墙,用着方便,但特殊情况也会发生命名冲突.
一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中.
2.命名空间的使用
命名空间样例:
namespace N{
int a = 10;
int b = 20;
}
1.加命名空间名称及作用域限定符
int main()
{
printf("%d\n", N::a);
return 0;
}
2.使用using将命名空间中某个成员引入
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
3.使用using namespace 命名空间名称引入
using namespce N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
printf("%d\n", a);
return 0;
}
3.命名空间中的结构体当定义结构体时如何使用
struct+命名空间名::结构体类型名+结构体变量名 = 初始化的值
![](https://img-blog.csdnimg.cn/49cfc39f71b145b79e1b814feb64acd5.png)
4.头文件与源文件中的命名空间重名会怎样?
.h/.c/.cpp重名且同局域的命名空间编译时会合并,如果引用头文件,也不必怀疑预处理头文件会展开,也就应对了在一个文件中,同局域的命名空间如果重名则会合并
2.C++输入&输出
1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
以及按命名空间使用方法使用std.
2.cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream>头文件中.
3.<<是流插入运算符,>>是流提取运算符.
4.C++的输入cin输出cout可以自动识别类型,C需要手动控制格式,当然配合使用最佳,按具体使用场景的来使用,例如:浮点型要求小数点后一位的打印,printf更适合.
5.实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识.
注意:C++区分C,C++头文件不带h,旧编译器(vc6.0)还支持iostream.h,后续编译器不支持.
3.缺省参数
1.缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值,即在没有传实参时,形参设置缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
#include <iostream>
using namespace std;
int test(int a = 10)
{
return a;
}
int main()
{
cout << test() << endl;
}
缺省参数的值是按实参顺序给,从左到右不可以跳,实参给值则用实参,不给则用缺省值,那么这个缺省参数会用到哪里呐?下面给个例子:顺序表的capacity(容量),StackInit初始化时可以不用传默认容量个数,使用缺省参数可以灵活多变,
//StackInit(struct Node* ptr,int defaultCP = 4);
2.缺省参数的分类
1.全缺省参数
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
2.半缺省参数
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
注意:
1. 半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现
3. 缺省值必须是常量或者全局变量
4. C语言不支持(编译器不支持)
4.函数重载
1.函数重载的概念
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题.
2.函数重载的使用:
当然调用时会自动识别类型来调用,因为在编译时会根据函数名长度、函数参数类型、返回值类型的首字母缩写来分明重载函数
下面代码的两个函数修饰名分别为_Z3addii和_Z3adddd,具体名字修饰的格式依据编译器不同而定.
函数重载的底层原理是编译时字符表(包括函数名和地址)内的函数名进行了修饰,编译器不同修饰方式不同,例如linux下的g++编译的函数.
例两个函数void f(int a,int c) 和 void f(int a,char c),修饰名分别为_z1fii和_z1fic,其中数字是函数名长度,f是函数名,f后面的是参数类型缩写,编译器依函数修饰名来调用(call)相关函数,而c语言中的字符表内容是函数名加地址,函数名不做修饰
#include <iostream>
using namespace std;
int add(int a,int b)
{
return a + b;
}
double add(double a,double b)
{
return a + b;
}
int main()
{
int sum1 = add(1,2);
double sum2 = add(1.1,2.2);
}
3.注意:
C语言不支持函数重载.
如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办
法区分。int f(int a) void f(int a) 返回类型不同不构成函数重载,就算是函数名修饰多加一个返回类型的缩写编译器也是会报错的,因为调用时存在二义性
2.函数重载的分类:
1.参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
2.参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
3.参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}