当前位置:主页 > c/c++教程 > C++引用变量

详解C++引用变量时那些你不知道的东西

发布:2023-03-12 20:00:01 59


本站精选了一篇相关的编程文章,网友文英悟根据主题投稿了本篇教程内容,涉及到C++引用变量、C++、变量、C++引用变量相关内容,已被590网友关注,涉猎到的知识点内容可以在下方电子书获得。

C++引用变量

引用变量延迟绑定

我们知道引用变量定义时要立刻赋值,告诉编译器他是谁的引用.如果不赋值,编译会失败.

如果引用变量是单个定义的,对他赋值还比较简单.

struct test_T
{
	int data;
	//...其他成员
	test_T(int _data = 0) :data(_data){}
};

struct SaveTest
{
	test_T & ref;
	//...其他成员
	SaveTest(test_T & _ref) :ref(_ref){}
};

int main(void)
{
	test_T *t   = new test_T[2];
	SaveTest *s = new SaveTest[2]{t[0], t[1]};

	for (int i = 0; i < 2; i++){
		t[i].data = i + 1;
	}

	for (int i = 0; i < 2; i++){
		printf("%d ", s[i].ref.data);
	}
	
	return 0;
}

如果数组很大.就不方便了.不方便用{}一个一个赋值了.

struct test_T
{
	int data;
	//...其他成员
	test_T(int _data = 0) :data(_data){}
};

struct SaveTest
{
	test_T & ref;
	//...其他成员
	SaveTest(test_T & _ref) :ref(_ref){}
};

int main(void)
{
	test_T *t   = new test_T[2000];
	SaveTest *s = new SaveTest[2000];//没有用{},编译直接报错

	for (int i = 0; i < 2000; i++){
		t[i].data = i + 1;
	}

	for (int i = 0; i < 20; i++){
		printf("%d ", s[i].ref.data);
	}
	
	return 0;
}

我的想法是:先要骗过编译器,调用SaveTest构造函数的时候先赋个默认值,真正的我们用的对象

引用,后面再慢慢赋值给它.

struct test_T
{
	int data;
	//...其他成员
	test_T(int _data = 0) :data(_data){}
};
//******************************增加全局唯一默认值
test_T default_test(-1);
//******************************
struct SaveTest
{
	test_T & ref;
	//...其他成员               修改构造函数
	SaveTest(test_T & _ref = default_test) :ref(_ref){}
};

int main(void)
{
	test_T *t   = new test_T[2000];
	SaveTest *s = new SaveTest[2000];//编译ok

	for (int i = 0; i < 10; i++){
		t[i].data = i + 1;
		s[i].ref = t[i];//重新赋值
	}

	for (int i = 0; i < 10; i++){
		printf("%d ", s[i].ref.data);
	}
	
	return 0;
}

输出:

怎么会这样???.(我现在还是不理解)

通过上面的方式,可以做到延迟赋值,但是赋值很奇怪,单个可以被修改,但是所有成员的ref都会一起被更改,真是秀儿~.

行,那就只能换个思路了.引用不能延迟赋值,指针类型可以吧,我用指针类型.

struct test_T
{
	int data;
	//...其他成员
	test_T(int _data = 0) :data(_data){}
};
//******************************全局唯一默认值
test_T default_test(-1);
//******************************
struct SaveTest
{
	test_T * ref;
	//...其他成员
	SaveTest(test_T * _ref = nullptr) :ref(_ref){}
};

int main(void)
{
	test_T *t   = new test_T[2000];
	SaveTest *s = new SaveTest[2000];//编译ok

	for (int i = 0; i < 10; i++){
		t[i].data = i + 1;
		s[i].ref = &t[i];//重新赋值
	}

	for (int i = 0; i < 10; i++){
		printf("%d ", s[i].ref->data);
	}
	
	return 0;
}

哼~,可以了吧.

等一下,等一下,跑题了,虽然这样做可以,但是不是用的引用实现的啊.

练剑的最高境界就是无剑胜有剑,达到人剑合一,剑既是我,我既是剑.

是时候,让指针跟引用合二为一啦.

struct test_T
{
	int data;
	//...其他成员
	test_T(int _data = 0) :data(_data){}
};

union MyUnion
{
	test_T * ptr;
	test_T & ref;
	MyUnion(){}
};
struct SaveTest
{
	MyUnion u;
	//...其他成员
	SaveTest(test_T& _ref){
		u.ptr = &_ref;
	}
	
	void set(test_T& _ref){
		u.ptr = &_ref;
	}
	test_T& get(){
		return u.ref;
	}
};

int main(void)
{
	test_T *t   = new test_T[2000];
	SaveTest *s = new SaveTest[2000];//编译ok

	for (int i = 0; i < 10; i++){
		t[i].data = i + 1;
		s[i].set(t[i]);//重新赋值
	}

	for (int i = 0; i < 10; i++){
		printf("%d ", s[i].get().data);
	}
	
	return 0;
}

使用者角度:

SaveTest *s = new SaveTest[2000];//只是定义变量,没有绑定
s[i].set(t[i]);//第一次具体赋值,绑定引用(站在使用者角度看)
s[i].get();//得到一个引用

内部:

每次保存的都是指针,每次使用的时候用引用.

从汇编角度,引用和指针,本是一家.

到此这篇关于详解C++引用变量时那些你不知道的东西的文章就介绍到这了,更多相关C++引用变量内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • c++中cin实现输入字符串方式

    发布:2023-03-10

    这篇文章主要介绍了c++中cin实现输入字符串方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • C++中顺序表操作的示例代码

    发布:2023-03-05

    这篇文章主要为大家详细介绍了C++中顺序表的基础操作的相关代码,主要有顺序表的输出、插入和删除数据等,感兴趣的小伙伴可以了解一下


  • c++中queue用法超详细讲解(入门必看!)

    发布:2023-03-07

    queue是一种容器转换器模板,调用#include< queue>即可使用队列类,下面这篇文章主要给大家介绍了关于c++中queue用法超详细讲解的相关资料,需要的朋友可以参考下


  • C++ IO设备读写功能实现详解

    发布:2023-03-10

    C++的文件IO(Input,Output)操作就是指对文件进行读写(输入与输出)的操作。输入就是从磁盘上的文件中读取内容到内存中。输出就是将内存中的数据内容输出或者说写入到磁盘的文件中,这篇文章主要介绍了C++ IO设备读写功能实现


  • C++中构造函数与析构函数的调用顺序详解

    发布:2022-10-21

    为网友们分享了关于C++的教程,C++ 语言一直被批评太复杂了,很多细节的地方需要仔细推敲,甚至其构造函数和析构的调用顺序也成为了一个让人迷惑的问题,在此我做了简单的总结。这篇文章主要介绍了C++中构造函数与析构函数的调用顺序,需要的朋友可以参考借鉴。


  • C++ 如何使用栈求解中缀、后缀表达式的值

    发布:2023-03-05

    这篇文章主要介绍了C++ 使用栈求解中缀、后缀表达式的值,本文讲解了中缀、后缀表达式的求值过程以及如何将一个中缀表达式转换成后缀表达式,需要的朋友可以参考下


  • C++笔记-设置cout输出数据的宽度和填充方式

    发布:2023-03-13

    这篇文章主要介绍了C++笔记-设置cout输出数据的宽度和填充方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • pycharm配置python环境的详细图文教程

    发布:2023-03-03

    PyCharm是一款功能强大的Python编辑器,具有跨平台性,下面这篇文章主要给大家介绍了关于pycharm配置python环境的详细图文教程,文中通过图文介绍的非常详细,需要的朋友可以参考下


网友讨论