C++_引用和命名空间

一.引用

    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++的输入输出就用了命名空间的原理。

猜你喜欢

转载自blog.csdn.net/warrior_harlan/article/details/80604147
今日推荐