咨询TODO类中复制构造函数重载正确性及引用符号必要性
问题解答
首先纠正:你写的不是复制构造函数
你代码里的TODO(const string& ent)是转换构造函数——用来把string类型转成TODO对象的构造函数,根本不是复制构造函数。
C++里复制构造函数的参数必须是当前类的引用(一般加const),标准写法是这样的:
TODO(const TODO& other) { // 把other的成员变量逐个复制到当前对象 entry = other.entry; listArray = other.listArray; // 注意:如果listArray是动态分配的内存,这里要做深拷贝,不然多个对象会共用同一块内存,析构时会出错 itemCount = other.itemCount; currInvItem = other.currInvItem; maxLength = other.maxLength; }
要是你不显式写复制构造函数,编译器会自动生成一个默认的,默认做浅拷贝(挨个成员复制)。但你的类里有指针成员List* listArray,浅拷贝很容易出问题——多个对象指向同一块内存,析构的时候重复释放,直接崩。这种情况就得自己写深拷贝的复制构造函数。
关于参数是否需要用引用
你写的const string& ent是完全正确且推荐的写法,理由很简单:
- 用引用能避免拷贝传入的
string,少一次内存拷贝,效率更高。 const保证不会改传入的字符串,符合构造函数只初始化对象的逻辑。
要是去掉引用写成TODO(string ent),会触发string的复制构造函数,平白多拷贝一次字符串,纯浪费性能。
另外提一句:你的setEntry函数参数string ent也可以改成const string& ent,同样是为了避免不必要的拷贝,优化性能。
内容的提问来源于stack exchange,提问作者Kate Rainey
相关产品推荐
相关产品推荐

