这些C ++函数返回什么? ClassA的*放大器; FUNC1()

时间:2012-09-07 09:30:37

标签: c++ pointers reference

大家都是编程C / C ++代码的专家 我偶然发现了这个代码,但我很困惑这2个函数返回的内容 任何善良的灵魂都可以帮助我吗? 我试图使代码成为通用的&尽可能对他人有用。

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 个答案:

答案 0 :(得分:4)

ClassA*& func1()

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

ClassA*& x = func1()
x = NULL

会改变mClassA

ClassA* func2()

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

答案 1 :(得分:1)

简而言之:

  • func1提供单个指针。

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

你可以更优雅地实现类似的目标:

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

func1()是迈耶的单身人士。它类似于创建全局指针。所以,这个函数创建一个指针“object”,并提供对它的完全访问,这意味着你可以这样做:

func1() = new ClassA;

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

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