草庐IT

弱引用

全部标签

【C++】C++入门—— 引用

引用1前情提要2概念剖析3引用特性4常引用5使用场景5.1做参数5.2做返回值6传值传引用的效率比较7引用与指针的差异Thanks♪(・ω・)ノ谢谢阅读下一篇文章见1前情提要在C语言中,我们往往会遇见复杂的指针(如数据结构之中的二级指针),理解起来比较复杂,C++对此加入了引用的概念。指针和引用的大部分功能类似,是重叠的。C++的引用可以在较为复杂的情况下进行一定替换,让代码变得更加简洁但是不能完全替代指针!!!2概念剖析C++中提出了一个新概念:引用引用为对象起一个别名,与对象使用同一内存空间。打个比方:孙悟空,又叫孙行者,又叫孙大圣,还叫齐天大圣。这个四个名字都指向同一个人。我们来看一个样

c++ - C++ 数组是通过引用传递还是通过指针传递?

在学校里,我们的讲师告诉我们,当我们将整个数组传递给函数时,整个数组都是通过引用传递的。不过,最近看了一本书。它说当将整个数组传递给函数时,数组默认通过pointer传递。书中进一步提到“通过指针传递与通过引用传递非常相似”,这意味着通过指针传递和通过引用传递实际上是不同的。看来不同的来源表述不同。所以我的问题是:在C++中,当我们将整个数组传递给函数时,数组是通过引用传递还是通过指针传递?例如:voidfuncA(int[]);//FunctionDeclarationintmain(){intarray[5];funcA(array);//Isarraypassedbyreforb

c++ - 如何初始化 const/non-const 静态引用成员?

classFoo{private:intm_i;public:Foo(inti):m_i(i){}};classFooA{private:conststaticFoo&m_foo;staticFoo&m_foo2;};Q1>如何初始化const静态引用?Q2>如何初始化非常量静态引用?注意:您可以对类FooA进行更改以说明这些方法。 最佳答案 以同样的方式初始化非引用static成员://Foo.cppconstFoo&FooA::m_foo=fooObj1;Foo&FooA::m_foo2=fooObj2;其中fooObj1和fo

c++ - 传递数组作为引用

在C++中,当我在编译时不知道大小时,如何传递数组作为引用?到目前为止,我发现让它工作的唯一方法是使用类似constdouble(&numbers)[size]但这意味着我需要在编译时知道数组的大小,因此我不能在外部函数中使用它。我的问题是:如果我不将数组作为(constdouble(&numbers)[length])传递,因为例如我不知道它的大小,我如何确定它没有被复制,但它被引用?如果我像上面的例子一样传递一个数组,(doublearray[])是引用还是复制? 最佳答案 其他答案都很好,但没有人提到使用模板来处理这个问题。你

c++ - 为什么不直接使用静态变量作为智能指针的引用计数

当我查看“增强”版本的智能指针时——增强是添加了引用计数——我看到他们使用了一些“复杂”的引用计数技术,例如一个完全独立的类或一个指向整数的指针。举个例子:templateclassSmartPointer{T*mp_T;unsignedint*mp_Count;public:...alltheAPIs...};我想知道,yield是多少?由于目标是让所有实例共享该值,为什么不将其声明为静态成员变量:templateclassSmartPointer{T*mp_T;staticunsignedintm_Count;public:...alltheAPIs...};我一定错过了什么,但经

c++ - 返回引用是什么意思?

我理解C++中引用的概念,我理解它们在函数参数中的作用,但我仍然对它们如何处理返回类型感到非常困惑。例如,在参数中使用时,这段代码:intmain(void){intfoo=42;doit(foo);}voiddoit(int&value){value=24;}类似于这段代码:intmain(void){intfoo=42;doit(&foo);}voiddoit(int*value){*value=24;}(知道每次doit的第一个代码示例中使用它时,编译器都会自动在value前面放置一个星号,但在后者中你每次尝试使用value时都必须在自己身上加上星号)那么,当用作引用时,下一段代

c++ - 插入流的右值引用是否合理有效?

我做了一个自定义的流类型,叫它error_stream,它派生自std::ostringstream。我还为名为throw_cpp_class的流创建了一个自定义操纵器(throw_cpp是throw_cpp_class的一个实例)。我的目标是使用以下语法:error_streams;s我发现,通过定义一个插入运算符,该运算符将对流的右值引用作为第一个操作数,我现在可以这样做:error_stream()插入运算符如下所示:error_stream&operator这是怎么回事?为什么我可以在需要error_stream&的地方返回error_stream&&类型的值?(这会调用移动构

c++ - 从临时变量返回的引用是否有效?

我遇到过一种情况,能够将方法调用链接到临时变量会非常有用:draw(Quad(0,0,1,1).rotate(90));//但是,我不确定临时变量是否会保持足够长的时间以供draw()函数使用它。这样做安全吗? 最佳答案 这种特殊用途是安全的。一个临时对象一直持续到创建它的完整表达式结束†;在这里,完整表达式是整个语句,包括对draw的调用。一般来说,这种模式可能很危险。以下给出了未定义的行为:Quad&rotated=Quad(0,0,1,1).rotate(90);draw(rotated);在我看来,我更希望类型是不可变的;与

c++ - C++ 引用是否保证使用指针 "internally"?

查看C++中的引用,我注意到我查看的所有实现都在内部使用了一个指针。C++标准是否保证引用将在内部使用指针,或者实现是否可以使用更“高效”的解决方案?(我目前看不出如何“更好”地完成它,因为当创建一个新的堆栈框架时,并没有真正可靠的方法来轻松地知道被引用的变量与堆栈基指针的偏移量是多少,因为堆栈非常有活力)注意:我确实理解C++中指针和引用之间的区别(这个问题与此无关) 最佳答案 如果您的意思是引用需要编译器为指针分配存储空间,那么这是未指定的。§8.3.2/4Itisunspecifiedwhetherornotareferenc

c++ - 通过引用使用 vector<int>::iterator 但有错误

#include#includeusingnamespacestd;intmain(){vectorvec={1,2,3,4};for(auto&it=vec.begin();it!=vec.end();++it){cout大家好,在C++中,我通过引用使用迭代器,例如“auto&it”,编译器返回错误"error:invalidinitializationofnon-constreferenceoftype'__gnu_cxx::__normal_iterator>&'fromanrvalueoftype'std::vector::iterator{aka__gnu_cxx::__n