Inside the c++ object model读书笔记之拷贝构造函数(一)
2014-03-21 00:43
351 查看
在C++中,会有三种情况以一个对象作为另一个对象的初值,分别为:
1.
2.
3.
在以上三种情况中,编译器会在必要的时候合成拷贝构造函数。那么何为必要的时候呢?首先看这样一种情况:
这种情况下,会以一种叫做Default memberwise initialization的手法来完成初始化Obj,这就相当于分别对每一个成员进行初始化,也就是所谓的逐位拷贝:
Obj.str = obj.str;
Obj.len = obj.len;
但是当String的对象作为了一个类成员变量时,情况有所改变,比如:
这种情况下,当有类对象做成员变量时,会把每个成员类对象以default memberwise initlization初始化。假如这时候的Sting类提供了一个拷贝构造函数:
那么这时候的编译器将需要为Word类合成一个拷贝构造函数以便调用成员类对象的拷贝构造函数,如下为测试例子:
运行结果为:
说明在Test类中,编译器合成了一个拷贝构造函数,并在函数中调用了Base类的拷贝构造函数,同时拷贝构造函数会复制每一个其它成员变量,需要注意是的是此处如果涉及的指针的复制是浅拷贝,所谓浅拷贝就是直接复制指针的值,而不是拷贝指针所指空间的值。
1.
class X { … }; X x; X xx = x;
2.
void fun(X x); X xx; Fun(xx);
3.
X fun() { Xxx; return xx; }
在以上三种情况中,编译器会在必要的时候合成拷贝构造函数。那么何为必要的时候呢?首先看这样一种情况:
class String { public: //………没有显示声明拷贝构造函数 public: char*str; intlen; }; String obj(“hello”); String Obj = obj;
这种情况下,会以一种叫做Default memberwise initialization的手法来完成初始化Obj,这就相当于分别对每一个成员进行初始化,也就是所谓的逐位拷贝:
Obj.str = obj.str;
Obj.len = obj.len;
但是当String的对象作为了一个类成员变量时,情况有所改变,比如:
class Word { public: //….没有提供显示的拷贝构造函数 public: int m; String word; };
这种情况下,当有类对象做成员变量时,会把每个成员类对象以default memberwise initlization初始化。假如这时候的Sting类提供了一个拷贝构造函数:
class String { public: String(constString&); public: char* str; int len; };
那么这时候的编译器将需要为Word类合成一个拷贝构造函数以便调用成员类对象的拷贝构造函数,如下为测试例子:
class Base { public: Base() {} ~Base() {} Base(constBase& obj) { cout<< "Base copy constructor!" << endl; } }; class Test { public: Test() {} ~Test() {} public: Base obj; int m; }; int main() { Testobj(); Testobject(obj); return0; }
运行结果为:
说明在Test类中,编译器合成了一个拷贝构造函数,并在函数中调用了Base类的拷贝构造函数,同时拷贝构造函数会复制每一个其它成员变量,需要注意是的是此处如果涉及的指针的复制是浅拷贝,所谓浅拷贝就是直接复制指针的值,而不是拷贝指针所指空间的值。
相关文章推荐
- 关于指针的一些事情
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- C++ Primer 第一部分基本语言
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析
- 深入解析C++中的引用类型
- C++可变参数的实现方法