大家都是编程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()中相互取消?
答案 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更改指向的对象。