命名空间
在C语言中,函数都是存放在全局作用域中,在命名时就要避免与库函数名称一致。但在C++中,我们可以用namespace来避免冲突。
命名空间定义
使用namespeace,后面加上命名空间的名字,最后接上{},{}中即是命名空间的成员。
namespace s1//s1是这个命名空间的名字
{
//里面可以定义变量、函数、类型
int num1 = 60;
int num2 = 30;
void swap(int* left, int* right)
{
int tmp = *left;
*left = *right;
*right = tmp;
}
struct node
{
int val;
struct node* next;
};
}
命名空间的使用
使用命名空间里面的成员有三种方式。
1、使用作用域限定符::,作用域限定符前面是命名空间的名字,作用域限定符后面是成员。
2、使用using将单个成员引入
使用using将num1和num2引入后,我们调用num1和num2就不再需要用s1::,但是swap依然需要用s1::
3、使用using namespace将所有成员引入
注意:使用第二和第三种方式后,成员是作用在全局域里。
输入输出
C++是兼容C语言的,C语言的printf等函数在C++中也可以使用,但是C++也有自己的输入cin和输出cout。调用C语言的库函数要包含头文件,C++自然也需要。使用cin和cout都要包含<iostream>头文件以及所在的命名空间std,可以使用using将单个成员引入或者用using namespace std将标准库全部展开。
cout
cout是标准输出对象,使用<<流插入运算符打印数据,可以自动识别类型。
cin
cin是标准输入对象,使用>>流提取运算符,也可以自动识别类型。
缺省参数
缺省参数是在函数定义或声明时给参数一个缺省值,在调用该函数时,若没有参数时则使用缺省值。
void fun6(int num1, int num2 = 20)
{
cout << num1 << endl;
cout << num2 << endl;
}
int main()
{
fun6(10);
fun6(10, 10);
return 0;
}
缺省参数分为全缺省和半缺省,全缺省是所有参数都给缺省值,半缺省是只给部分参数缺省值。
缺省参数必须从右往左依次来给出,中间不可以有间隔
//缺省值必须从右往左一次给,以下声明都是错误的
void fun1(int num1=0, int num2)
void fun2(int num1, int num2=0,int num3)
缺省参数不可以在声明和定义里同时出现
例如:
//即使缺省值给的是一样的,也是错误的
void fun1(int num1 = 0);
void fun1(int num1 = 0)
{
}
缺省值必须是常量或者是全局变量,在使用带有缺省参数的函数时,参数必须从左往右给,不可以跳着给。
例如:
void fun1(int num1 = 1,int num2 = 2)
{
}
int main()
{
fun1();
fun1(0);
fun1(0,0);//上面都是正确的
fun1(,0);//错误的,参数必须从左往右给
return 0;
}
函数重载
在C语言中,函数的名称是不可以相同的,那么在函数命名的时候会加很多东西。比如我们需要一个交换两个整形变量的函数和一个交换两个浮点形变量的函数时,它们的功能都是一样的,但是在C语言中为了区分它们函数名必须不同。在C++中函数重载解决了这个问题。
C++允许在同一作用域中声明几个功能类似的同名函数,这些函数的区别是参数列表不同,如参数类型不同,参数个数不同或参数顺序不同。
例如:
void fun1(int num1)
{
}
void fun1(float num1)
{
}
//构成重载 函数的类型不同
void fun2(int num1)
{
}
void fun2(int num1 ,int num2)
{
}
//构成重载 函数的个数不同
void fun3(int num1 ,float num2)
{
}
void fun3(float num1 ,int num2)
{
}
//构成重载 函数顺序不同
引用
引用不是定义一个变量,而是给变量取一个别名
int main()
{
int num1 = 10;
int& num2 = num1;
cout << &num1 << endl;
cout << &num2 << endl;
return 0;
}
可以看出num1和num2是同一块空间。
引用的特性
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
引用的一些用途
1.做函数参数
void swap(int& num1, int& num2)
{
int tmp = num1;
num1 = num2;
num2 = tmp;
}
传参时不需要传地址
2.做函数返回值
函数如果是值返回,会先将返回值在寄存器拷贝一份,再由外面接收返回值。但使用引用返回则不会将返回值拷贝再赋值,效率有很大的区别。但注意,引用返回的对象必须出了函数作用域依然存在,否者只能用值返回。
//正确,动态开辟的空间在堆上,出了函数依然存在
int*& fun1()
{
int* p = (int*)malloc(sizeof(int));
return p;
}
int num1 = 10;
//正确,num1的作用域是全局,出了函数依然存在
int& fun2()
{
num1++;
return num1;
}
//错误,num2是在函数内定义的局部变量,出了作用域将被销毁
int& fun3()
{
int num2 = 10;
return num2;
}
内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
内联函数不建议定义和声明分离,因为内联函数会在调用点展开,不会进入符号表,在链接时会找不到。