C++复制构造函数在构造函数的初始化参数列表中的调用,语法无错,执行报错?

发布于 2022-09-12 04:41:17 字数 668 浏览 20 评论 0

初学C++,有Java背景。

今天学到复制函数这边,突发奇想,如果类A被作为类B的构造函数的参数传递进去,然后又通过初始化列表进行赋值,那么类 A 的复制构造函数会被调用几次?

我猜测可能会有两次,所以做个试验验证一下,但是语法检查无措,在执行时,却一大堆错误。

先上代码

class Clock {

public:

Clock(int h, int m, int s) :hour(h), minute(m), second(s) {}

Clock(Minu m) : minu(m) {}

private:

int hour, minute, second;

Minu minu;

};

class Minu {

public:

Minu(): minute(0) {} // 普通无参构造函数

Minu(const Minu& m) { // 复制构造函数

cout << "调用复制构造函数" << endl;

}

private:

int minute;

};

int main() {

Minu m;

Clock clockA(m);

return 0;

}

代码语法检查没有问题,但是一运行,报错一大堆。

image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夏末的微笑 2022-09-19 04:41:17

C++前置声明了解一下。就是先告诉你有这个类的存在,但是不告诉你实现,然后你就可以用指针去指向这个类了。(当然实现还是要的,可以在任何地方实现,不一定要强调位置)
由于Minu类在Clock类中它不认识,所以就给你报一堆语法错误。
解决方法有两种。一种楼上的已经提到了,把Minu放到Clock前面定义。第二种就是采用前置声明。
你要是有接触到友元函数,会发现前置声明的用法有很多。

天涯沦落人 2022-09-19 04:41:17

你这个就是语法错误啊,一般主流的编译器在你编译之前就提示给你了,c++的很多符号可见性从符号定义处开始,并不能在定义之前使用,例如你的第二个类。

梦境 2022-09-19 04:41:17

将定义前置

如 @p_n 所说,是你说的这个问题。我把 Minu 放到上面去就可以了,

class Minu {

public:
    Minu() : minute(0) {}    // 普通无参构造函数

    Minu(const Minu& m) {    // 复制构造函数
        cout << "调用复制构造函数" << endl;
    }

private:
    int minute;
};

class Clock {
public:
    Clock(int h, int m, int s) :hour(h), minute(m), second(s) {}
    Clock(Minu m) : minu(m) {}

private:
    int hour, minute, second;
    Minu minu;
};

int main() {
    Minu m;
    Clock clockA(m);
    return 0;
}

多谢你了!

另外,我在学到这块的时候有点疑问,为什么在 C++ 中函数传参还需要重新构造一个对象,然后使用初始化列表的时候,我猜测这里也是一个函数调用,相当于又穿了一次参数,又构造了一次对象,我的理解来说,这两次构造的对象没什么意义。

前向声明

这个是我目前所学习的教程中介绍的前置声明的写法,但运行的时候还会报这个Minu类没有定义的错误,要是方便的话,可以帮我解答下是哪里有问题。

class Minu;

class Clock {
public:
    Clock(int h, int m, int s) :hour(h), minute(m), second(s) {}
    Clock(Minu m) : minu(m) {}

private:
    int hour, minute, second;
    Minu minu;
};

class Minu {

public:
    Minu() : minute(0) {}    // 普通无参构造函数

    Minu(const Minu& m) {    // 复制构造函数
        cout << "调用复制构造函数" << endl;
    }

private:
    int minute;
};

int main() {
    Minu m;
    Clock clockA(m);
    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文