C++ C+中需要什么+;这样我们就可以一直使用引用而不使用指针了?

C++ C+中需要什么+;这样我们就可以一直使用引用而不使用指针了?,c++,C++,根据我在网上的发现,你应该尽可能多地使用引用,除非你必须使用指针。据我所知,使用指针的唯一原因是: 处理原始内存时或 当您可能必须返回null或 处理从new()返回的新分配对象时 第一个问题真的无法解决。这是任务中固有的。 第二个可以由空对象模式处理,并返回对该空对象的引用。它要求您为每个类实例定义一个Null对象,以便能够将其引用为Null。 第三个可以用智能指针处理 我想知道的是:是否有可能“在C++中使用java”并完全使用引用编程,而完全忽略指针?在语言中,是否可以定义C++中的空

根据我在网上的发现,你应该尽可能多地使用引用,除非你必须使用指针。据我所知,使用指针的唯一原因是:

  • 处理原始内存时
  • 当您可能必须返回null
  • 处理从new()返回的新分配对象时
第一个问题真的无法解决。这是任务中固有的。 第二个可以由空对象模式处理,并返回对该空对象的引用。它要求您为每个类实例定义一个Null对象,以便能够将其引用为Null。 第三个可以用智能指针处理

我想知道的是:是否有可能“在C++中使用java”并完全使用引用编程,而完全忽略指针?在语言中,是否可以定义C++中的空对象,比如java?< /p>
对不起,如果问题是很糟糕的,或者是FAQ,我对C++很生疏,我必须在其中启动一个新的项目,所以我需要重新学习一些新的东西,习惯于用不同的方式思考。

< p>你不能重新引用一个引用,但是你可以重新使用一个指针来指向新的变量,这个行为无论如何都不能在引用中被模拟。(引用始终绑定到它们初始化到的变量)指针在实现这一点时所提供的便利性实际上会使C++没有指针,而引用几乎是不可能的。

需要什么?可回溯引用- AKA指针。引用一旦被绑定,就不能更改其仲裁员。

struct Anchor{ /*some data*/ };

struct Sprite{
  void set_anchor(Anchor const& a){ _anchor = &a; }
  Anchor const* _anchor;
};

struct Entity{
  Anchror _anchor;
};

这样的话,你可以通过改变它的锚来重新定位屏幕上的<代码> SpRITE <代码>。你如何用引用来完成它?< /P> < P>我已经使用C++代码重新分配了C++引用:

struct EmptyType {};
const EmptyType Null;

template<typename DataT>
class DynamicReferenceT
{
    union
    {
        DataT & _ref;
        DataT * _ptr;
    };

public:
    DynamicReferenceT(DataT & r) : _ref(r) { }

    void operator=(DataT & r) { _ptr = &r; }
    void operator=(const EmptyType &) { _ptr = NULL; }
    DataT & operator()() { return _ref; }
};

class SomeClass
{
    int _value;

public:
    SomeClass(int val) : _value(val) {}
    int value() { return _value; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    SomeClass objA1(100), objA2(200), objA3(300);

    // initially define the dynamic ref
    DynamicReferenceT<SomeClass> refObj(objA1);
    cout << "refObj = " << refObj().value() << endl;

    // reassign the dynamic ref
    refObj = objA2;
    cout << "refObj = " << refObj().value() << endl;

    refObj = objA3;
    cout << "refObj = " << refObj().value() << endl;

    // assign "null" to reference
    refObj = Null;

    return 0;
}

// output
100
200
300
struct EmptyType{};
常量EmptyType Null;
模板
类动态引用
{
联盟
{
数据和参考;
DataT*_ptr;
};
公众:
DynamicReferenceT(DataT&r):\u ref(r){}
void运算符=(DataT&r){{u ptr=&r;}
void运算符=(const EmptyType&){ptr=NULL;}
DataT&运算符(){return\u ref;}
};
上课
{
int_值;
公众:
SomeClass(int-val):_-value(val){}
int value(){return_value;}
};
int _tmain(int argc,_TCHAR*argv[]
{
某些类别的objA1(100)、objA2(200)、objA3(300);
//最初定义动态引用
动态参考REFBJ(objA1);

cout您不能重置引用,也不能有空引用。Java调用的引用实际上是指针。我不知道您为什么要避免它们。引用(在C++中)有一个特定的角色:它们允许使用与按值传递/返回相同的语法,没有开销;它们还可以用于输入输出参数和公开对象的内部(例如,
操作符[]
通常会返回引用)。除了作为函数参数或返回值之外,它们应该是相当罕见的。

正如您所知,空对象模式非常糟糕。这不是一种影响深远的解决方案


C++ C++的“引用”实际上是C++的“指针”。C++的“引用”没有java等价物。

第二个可以用<代码> Boo::可选的< /C> >来完成。java的作用更像是总是使用指针,而使用点符号,而C++使用“->”符号。(因为在引用时使用了点符号)。我的意思是,在java中,你有一个空引用,而=比较地址,而在C++中,代码> = = >与<代码>。实际上java的引用行为更像C++指针,C++引用,因为可以是空的,可以重新分配,比较它们的地址而不是对象。所以GrasZZLY:这取决于你所说的“不使用指针”。如果我写代码< STD::SyrdypT.Myfo。(新富)
,我的代码中没有指针类型,但当然有一个指针类型的子表达式。如果我们从
共享的\u ptr
中提取
操作符->
,只使用
操作符*
,那么我们就可以使用智能指针,而不必直接使用指针,所以除了首先创建它们之外,我们不需要这样做“使用指针”是为了使用智能指针。是否认为“不使用原始指针”是一个问题。"C++中的引用的目的是支持引用调用、引用返回和引用引用。几乎没有任何其他的程序员使用它。许多C++程序员认为C++引用是java引用或C引用,但它们不是。+类似于C#中的
ref T
,而不是C#中的类引用。如果您想要类似于C#引用的东西,请使用智能指针,如
std::shared#ptr
std::unique#ptr
,具体取决于所需的所有权语义。如果您仅限于数据表示,是的。没有任何东西可以阻止您使用functi执行此操作@MSN:您能详细说明一下您的评论吗?恐怕我不明白。如果您不保留引用,例如,将引用绑定到数据,您可以“重置”通过将不同的引用传递给函数来实现它们。例如,重置引用只是长寿命数据的一个问题。@MSN,你所说的就像函数式编程一样,总是有不可变的对象,对吗?@Lol4t0,这是类似的,是的。其思想是从输入中导出你关心的状态,而不是n坚持它。哦…哇。我忘了。你不能重新分配引用。一旦绑定,它们就会粘附到该对象。这在C++0x中可能吗?@Xeo:有关详细信息,请参阅Haskell