一.引用
1.概念:引用不是定义一个新的变量,而是给已经存在的变量取了个别名,它和它引用的变量共用一块内存空间,编译器不会为它开辟新空间。
2.使用:类型& 引用变量名 = 引用实体
3.特性: 1>引用在定义时必须初始化
2>一个变量可以有多个引用
3>引用对象一旦确定,不能更改
简单的使用
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int& ra = a;
int& eb = a; //可以有多个引用
cout << ra <<eb<< endl;
const int b = 20;
const int& rb = b; //被引用对象有const修饰,引用也必须有const
cout << rb << endl;
const int& rc = 10; //必须有const,因为引用常量
cout << rc << endl;
double d = 12.13;
const int& rd = d;
cout << rd <<" &rd:"<< &rd<<endl; //结果:12,类型转换
d = 100;
cout << d <<" &d:"<< &d <<endl;
cout << rd << endl; //结果:12 ,rd和d的地址并不相同,说明rd没有引用d
int array[3] = { 1, 2, 3 }; //数组引用
int(&ar) [3] = array;
cout << ar[2] << endl;
return 0;
}
4.应用实例
1>作为函数形参
void Swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 12;
int b = 20;
Swap(a, b);
cout << a << " " << b << endl; //20 12
return 0;
}
优点:不用使用指针,减少出错,代码更加简单
2>作为函数返回值
int& Test(int& a)
{
a += 10;
return a;
}
int main()
{
int a = 10;
int b = Test(a);
cout << b << endl; //20
注意:不能返回栈空间上的引用。空间会销毁
效率:引用>传地址>传值
在函数执行完后,栈上的空间被销毁,找不到a了
返回值如果是引用类型,返回值的生命周期一定要比函数生命周期长。
5.引用的原理
引用: 指针:
引用和指针底层实现方式是一样的
6.指针和引用的区别
1)初始化:引用在定义时必须初始化,指针没有。
2)引用指定到某个对象后,无法更改,指针可以更改。
3)没有NULL引用,但又NULL指针。
4)sizeof:引用结果为引用类型的大小,指针是地址空间所占字节数。
5)引用自主改变变量内容,指针自主改变指针指向。
6)有多级指针,没有多级引用。
7)指针手动寻址,引用通过编译器寻址。
8)引用比指针使用起来相对安全,也方便一些。
二.命名空间
1.本质:定义了一个新的作用域,命名空间的所有内容都局限在该命名空间中。
2.目的:使用命名空间的目的是对标识符的名称进行本地化,以免命名冲突或名字污染
3.关键字:namespace
简单调用:
namespace N1 //定义
{
int a;
int add(int left, int right)
{
return left + right;
}
}
int main()
{
int c;
c=N1::add(10, 20); //命名空间的调用
cout << c << endl;
return 0;
}
命名空间可以嵌套
namespace N1
{
int a;
int b;
int add(int left, int right)
{
return left + right;
}
namespace N2
{
int c;
void FunTest()
{
cout << "This is FunTest" << endl;
}
}
}
int main()
{
cout << N1::add(1, 2) << endl;
N1::N2::FunTest(); //嵌套调用
return 0;
}
命名空间名称可以相同,编译器最后会合成到同一个命名空间中。
没有名称的命名空间相当于在全局中定义,只在本文件中使用。
namespace
{
void User()
{
cout << "HAH" << endl;
}
}
int main()
{
User();
return 0;
}
使用:
namespace N1
{
int a = 10;
int b = 20;
void FunTest()
{
cout << "hello" << endl;
}
}
using N1::a; //a在全局中声明
using namespace N1; //N1在全局中声明
int main()
{
cout << a << endl;
FunTest(); //直接调用
return 0;
}
C++的输入输出就用了命名空间的原理。