我看到了有关构造函数的在线C ++测试。我可以弄清楚大部分的答案,但我对以下的一些人感到困惑。希望有人可以帮助我。
以下是这个例子。
#include <iostream>
class A {
public:
A(int n = 0) : m_n(n) {
std::cout << 'd';
}
A(const A& a) : m_n(a.m_n) {
std::cout << 'c';
}
private:
int m_n;
};
void f(const A &a1, const A &a2 = A())
{
}
int main() {
A a(2), b;
const A c(a), &d = c, e = b;
b = d;
A *p = new A(c), *q = &a;
static_cast<void>(q);
delete p;
f(3);
std::cout << std::endl;
return 0;
}
我真正得到的是为什么&#34;&amp; d = c&#34;没有输出任何东西。还添加另一个重载构造函数,如A(const A * a):m_n(a-> m_n){std :: cout&lt;&lt; &#39; B&#39 ;;不输出* q =&amp; a的任何内容。那么我该怎么办呢?
非常感谢任何建议。我对此非常好奇。
答案 0 :(得分:8)
这些没有输出,因为d
和q
不属于A
类型,即它们不是A
个对象。 d
是引用到A
,而q
是指针到A
。初始化引用并初始化或指定指针根本不会操纵引用/指向A
对象,因此没有输出。
要解决您的问题 - 没有任何事情要做,#34;做工作,&#34;它的工作正常。
答案 1 :(得分:2)
更清楚的是,我将重写此声明
const A c(a), &d = c, e = b;
作为
const A c(a);
const A &d = c;
这里d被声明为对类型A的对象的引用。它不会创建新对象。它指的是已经创建的对象。在这种情况下,d参考c。事实上,d只是对象c的别名。
此代码段
A *p = new A(c), *q = &a;
也可以简单重写
A *q = &a;
在此语句中,指针q仅由a的地址指定。两个对象都没有创建。简单地说q现在指向已经创建的早期对象a。
答案 2 :(得分:1)
&d = c
没有输出任何内容,因为您没有调用构造函数。
如果我们稍微扩展一下代码片段......
A &d = c
您的代码所说的是&#34;将d
声明为引用到A类型的对象,该对象指向c
&#34; 。由于您正在创建引用,因此您不会调用构造函数,c
和d
是同一个对象。
同样适用于q
,但您不是创建引用,而是创建指针并为其指定类型为A
的现有实例的地址。没有调用构造函数,因为您没有创建单独的对象,而是链接到现有对象。