2

大家好,C/C++ 代码编程专家。
我偶然发现了这段代码,但我对这两个函数返回的内容感到困惑。
有好心人能帮帮我吗?
我试图使代码尽可能通用且对其他人有用。

ClassA*& func1() {
    static ClassA* mClassA;
    return mClassA;
}

ClassA* func2() {
    ClassA*& mClassA = func1();
    if(!mClassA) {
        ... // omitted some code that fill mClassA with data.
    }
    return mClassA;
}

[编辑] 还想问,func1() 和 func2() 中的 *& 是否相互抵消?

4

4 回答 4

4
ClassA*& func1()

通过引用返回方法内部声明的静态指针。正在做:

ClassA*& x = func1()
x = NULL

会改变mClassA

ClassA* func2()

返回指针的副本。它将指向相同的内存,但更改指针不会影响mClassA.

于 2012-09-07T09:32:39.917 回答
1

简而言之:

  • func1提供了一个单例指针。

  • func2提供一个类型为 的单例对象ClassA,使用来自的单例指针func1作为实现设备。

您可以像这样更优雅地实现类似的目标:

ClassA & getA()
{
    static ClassA impl = initialize_A();  // Or a lambda or just a constructor.
    return impl;
}

这也将在程序结束时以正确的顺序清理实现实例,而无需手动销毁。

于 2012-09-07T10:10:26.197 回答
0

func1()返回对指针的引用;实际上,这意味着它返回与函数内部使用的指针相同的指针,而不是对其的副本。这样,如果您更改指针的值(而不是更改它所指向的对象的值),您实际上会更改函数内部指针的值。

这就是使func2()工作正常的原因。它获取mClassA内部静态指针的引用并func1()在必要时更新其值,然后返回指针的副本;这是一个指向与 相同地址的指针mClassA

于 2012-09-07T09:37:06.463 回答
0
ClassA*& func1() {
    static ClassA* mClassA;
    return mClassA;
}

func1()有点像迈耶的单身人士。它类似于创建全局指针。因此,此函数创建一个指针“对象”,并提供对其的完全访问权限,这意味着您可以执行以下操作:

func1() = new ClassA;

func2()只返回一个指针的副本。这意味着您不能像上面那样更改它* 。

* 可以使用placement new 来改变指向的对象。

于 2012-09-07T09:58:38.597 回答