C++类P的多构造函数实现及Data类相关技术疑问
嘿,我来帮你把这个问题捋清楚——你现在在准备C++考试,之前因为包含Data类对象作为成员的类P的内聚性问题丢分,现在要搞定P的无参、全参和拷贝构造函数,对吧?先给你明确说:你当前的P类声明是没问题的,但构造函数的实现还需要补全,我一步步给你讲明白怎么写,还有那些giorno(0)这类初始化的工作原理。
P构造函数的正确性分析与实现方案 1. 无参构造函数P()
当你创建P的无参对象时,P的成员birthday(Data类型)会自动调用Data的无参构造函数完成初始化——也就是Data()里的giorno(0), mese(0), anno(0)那部分逻辑。所以P的无参构造函数实现可以非常简洁:
P::P() { // 不需要额外操作,birthday会自动触发Data的无参构造 }
如果你想更规范(养成好习惯),也可以显式用初始化列表调用Data的无参构造,效果完全一致:
P::P() : birthday() {}
2. 全参构造函数P(const int, const int, const int)
你猜的没错,这个构造函数就是用来接收日、月、年参数,进而初始化birthday成员的。这里必须用初始化列表来调用Data的全参构造函数——这是初始化类类型成员的最优方式,比在函数体里赋值更高效(因为函数体执行时成员已经默认构造过了,再赋值属于修改而非初始化)。
正确实现如下:
P::P(const int g, const int m, const int a) : birthday(g, m, a) { // 这里birthday已经通过Data的全参构造完成初始化,无需额外代码 }
这里的birthday(g, m, a)会直接调用Data的Data(const int&, const int&, const int&)构造函数,把传入的日、月、年分别传递给giorno、mese、anno完成初始化。
3. 拷贝构造函数P(const P&)
拷贝构造函数的作用是用一个已有的P对象初始化新的P对象。因为Data已经提供了自己的拷贝构造函数,我们只需要在初始化列表里把传入对象的birthday拷贝给当前对象的birthday即可:
P::P(const P& other) : birthday(other.birthday) { // 调用Data的拷贝构造函数,完成birthday的拷贝 }
顺带提一句:如果你不手动写这个拷贝构造函数,编译器会自动生成一个默认的拷贝构造,它会自动调用成员变量的拷贝构造(也就是Data的拷贝构造),效果和上面的代码一样。但既然考试要求你实现,手动写出来会更稳妥。
关于giorno(0)、mese(0)的工作原理
你看到的giorno(0)这种写法是成员初始化列表的语法,它的核心作用是:在对象创建的最早期(进入构造函数体之前)就完成成员变量的初始化,而不是先默认构造再赋值。
以Data的无参构造为例:
Data(): giorno(0), mese(0), anno(0){}
这条语句会在构造函数体执行前,直接把giorno设为0、mese设为0、anno设为0——这是初始化成员变量最直接高效的方式,尤其是对于类类型的成员(比如P里的birthday),必须通过初始化列表来调用它们的构造函数,否则编译器会自动调用默认构造,再赋值就多了一步不必要的操作。
完整代码示例(包含实现)
把所有代码整合起来,完整版本如下:
Data.h
#ifndef DATA_H #define DATA_H #include <iostream> #include <cstring> using namespace std; class Data{ friend ostream& operator<<(ostream&, const Data&); friend istream& operator>>(istream&, Data&); protected: int giorno; int mese; int anno; public: Data(): giorno(0), mese(0), anno(0){} Data(const int& g, const int& m, const int& a): giorno(g), mese(m), anno(a){} Data(const Data& D) : giorno(D.giorno), mese(D.mese), anno(D.anno){} //... 其他成员函数(比如你省略的部分) }; #endif // DATA_H
P类的实现(可以放在头文件或单独的.cpp文件)
#include "Data.h" class P{ protected: Data birthday; public: P(); P(const int, const int, const int); P(const P&); }; // 无参构造函数 P::P() : birthday() {} // 全参构造函数 P::P(const int g, const int m, const int a) : birthday(g, m, a) {} // 拷贝构造函数 P::P(const P& other) : birthday(other.birthday) {}
内容的提问来源于stack exchange,提问作者Eddo10957

