[Effective C++ --012]复制对象时勿忘其每一个成分

时间:2022-09-24 09:16:39

引言:

在深拷贝和浅拷贝的理解中,我们知道了“拷贝构造函数”一词,并且也了解了它的构成。

A(const A& r);  // 形式有多种,在这里只列出一个

因此,在值传递的应用场景里,我们可以写出以下的拷贝构造函数:

 #include <iostream>
#include<string>
using namespace std; class A {
public:
A(int i) : count(i) {};
A(const A& r) { // 拷贝构造函数
count = r.count;
}
~A() {};
void out() {
cout << "count:" << count << endl;
}
private:
int count;
}; int main()
{
A a();
A a1(a); // 将a的临时变量传递进去 a1.out();
return ;
}

输出结果:1

一、不要忘记复制每一个成员

在引言的例子里,我们完整将count通过拷贝构造函数复制了过来。如果我们此时有了新需求,需要给类A增加一个成员x,那么在拷贝构造函数中,一定不要忘记拷贝x!

 #include <iostream>
using namespace std; class A {
public:
A(int i, int j) : count(i),x(j) {};
A(const A& r) {
count = r.count;
x = r.x; // 不要忘记赋值成员x!
}
~A() {};
void out() {
cout << "count:" << count << endl;
cout << "x:" << x << endl;
}
private:
int count;
int x;
}; int main()
{
A a(, );
A a1(a); a1.out();
return ;
}

值得注意的是:如果我们遗漏了第9行代码,编译器是不会报错的,甚至也能正常运行,但是不会得出想要的结果1!

 二、拥有"显示"拷贝构造函数发生继承

在上面的A类中, 我们已经针对A写出了显示的拷贝构造函数。但是如果此时发生了继承会怎么样呢?

假设我们有class  B: public A

 class B: public A {
public:
B(int x, int y) : b1(x),b2(y){};
B(const B& r){
b1 = r.b1;
b2 = r.b2;
};
~B() {};
void out() {
cout << "b1:" << b1 << endl;
cout << "b2:" << b2 << endl;
}
private:
int b1, b2;
};

简直跟class A一样有木有?

于是我们开始编译 B b(2,2); B b1(b);

会出现以下错误:

error C2512: 'CPS' : no appropriate default constructor available

这是为什么呢?

在类B的拷贝函数中看起来好像赋值了B中的每一个东西,但是它们复制的只是B声明的成员变量b1,b2;B继承A的成员变量附件完全木有得到复制啊!

在创建对象时,会首先调用A类的构造函数。而在B的初始化列表中,并没有显示的对基类的构造函数进行调用。那么,系统会默认调用A的无参构造函数,但是你的A类并没有定义无参构造函数,所以出错了!

改法如下:

 class B: public A {
public:
B(int x, int y) : b1(x),b2(y), A(x, y) {}; // 调用A的构造函数
B(const B& r) : A(r.b1, r.b2){ // 调用A的构造函数
b1 = r.b1;
b2 = r.b2;
};
~B() {};
void out() {
cout << "b1:" << b1 << endl;
cout << "b2:" << b2 << endl;
}
private:
int b1, b2;
};

◆总结

1.拷贝函数应该确保复制对象内的所有成员变量及所有的基类成分。

2.不要尝试以某个拷贝函数实现另一个拷贝函数。应该将共同机能放进第三个函数中,并由两个拷贝函数共同调用。

[Effective C++ --012]复制对象时勿忘其每一个成分的更多相关文章

  1. EC笔记:第二部分:12、复制对象时勿忘其每一个成分

    EC笔记:第二部分:12.复制对象时勿忘其每一个成分 1.场景 某些时候,我们不想使用编译器提供的默认拷贝函数(包括拷贝构造函数和赋值运算符),考虑以下类定义: 代码1: class Point{ p ...

  2. Effective C&plus;&plus;&lowbar;笔记&lowbar;条款12&lowbar;复制对象时勿忘其每一个成分

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 编译器会在必要时候为我们的classes创建copying函数, ...

  3. Effective C&plus;&plus; -----条款12&colon; 复制对象时勿忘其每一个成分

    Copying函数应该确保复制“对象内的所有成员变量”及“所有base class成分”. 不要尝试以某个copying函数实现另一个copying函数.应该将共同机能放进第三个函数中,并由两个cop ...

  4. Effective C&plus;&plus; 条款12:复制对象时勿忘其每一个成分

    void logCall(const std::string& funcName); class Customer { public: ... Customer (const Customer ...

  5. EC读书笔记系列之7:条款12 复制对象时勿忘其每一个成分

    记住: ★copying函数应确保复制“对象内的所有成员变量”及“所有base class成分” ★不要尝试以某个copying函数实现另一个copying函数.应该将共同机能放进第三个函数中,并由两 ...

  6. 条款12:复制对象时勿忘其每一个成分(Copy all parts of an object)

    NOTE: 1.Copying 函数应该确保复制“对象内的所有成员变量”及“所有base class成分”. 2.不要尝试以某个copying函数实现另一个copying函数.应该将共同机能放进第三个 ...

  7. C&plus;&plus;复制对象时勿忘每一部分

    现看这样一个程序: void logCall(const string& funcname) //标记记录 { cout <<funcname <<endl; } cl ...

  8. Effective C&plus;&plus;&lpar;12&rpar; 复制对象时要复制每一个成员

    问题聚焦: 负责拷贝的两个操作:拷贝构造函数和重载赋值操作符. 一句话总结,确保被拷贝对象的所有成员变量都做一份拷贝. Demo   void logCall(const std::string&am ...

  9. Effective C&plus;&plus;:规定12:不要忘了复制的对象时,它的每一个组成部分

    (一个) 继承制度的声明: class Date {...}; class Customer { public: ... private: string name; Date lastTransact ...

随机推荐

  1. window下编译并使用google protobuf

    参考网址: http://my.oschina.net/chenleijava/blog/261263 http://www.ibm.com/developerworks/cn/linux/l-cn- ...

  2. 发现的eval的一个小问题

    首先我们来看五段代码: 第一段代码: function test(){ eval('var a = 1;'); alert(a); } test(); 第二段代码: function test(){ ...

  3. Linux命令&colon;修改文件权限命令chmod、chgrp、chown的区别

    chmod是更改文件的权限 chown是改改文件的属主与属组 chgrp只是更改文件的属组. (1)chmod是修改文件/目录的权限.可以有文字修改和数字修改. #chmod 777 /home/be ...

  4. 关于EEG参考电极

    今天搞ADS1299,里面的BIAS偏置运放原来是设置参考电极的. The input multiplexer has EEG-specific functions for the bias driv ...

  5. Xutils的使用 转载 带自己细细研究

    单例模式static DbUtils db = null; public static DbUtils getDb(Context context) { if (context == null) { ...

  6. 权重随机算法的java实现

    一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...

  7. CCF系列之数字排序&lpar;201503-2&rpar;

    问题描述试题编号: 201503-2试题名称: 数字排序时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输 ...

  8. 【BZOJ2241】【Sdoi2011R1D1】打地鼠

    原题传送门 Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. ...

  9. 杨辉三角 II

    题目描述 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] 贴出代码 class ...

  10. Spring-AOP环绕监听出错

    Exception in thread "main" org.springframework.aop.AopInvocationException: Null return val ...