类构造函数如何在C ++中工作

时间:2014-03-25 13:00:02

标签: c++

我看到了有关构造函数的在线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的任何内容。那么我该怎么办呢?

非常感谢任何建议。我对此非常好奇。

3 个答案:

答案 0 :(得分:8)

这些没有输出,因为dq不属于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; 。由于您正在创建引用,因此您不会调用构造函数,cd是同一个对象。

同样适用于q,但您不是创建引用,而是创建指针并为其指定类型为A的现有实例的地址。没有调用构造函数,因为您没有创建单独的对象,而是链接到现有对象。