- 浏览: 33911 次
- 性别:
- 来自: 南京
只有单个形参,而且该形参是对本类类型对象的引用(常用 const 修饰),这样的构造函数称为复制
构造函数
复制构造函数可用于:
1. 根据另一个同类型的对象显式或隐式初始化一个对象
2. 复制一个对象,将它作为实参传给一个函数
3. 从函数返回时复制一个对象
4. 初始化顺序容器中的元素
5. 根据元素初始化式列表初始化数组元素
当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构
造函数,复制初始化总是调用复制构造函数
对于类类型对象,只有指定单个实参或显式创建一个临时对象用于复制时,才使用复制初始化
当形参或返回值为类类型时,由复制构造函数进行复制
如果没有为类类型数组提供元素初始化式,则将用默认构造函数初始化每个元素
如果我们没有定义复制构造函数,编译器就会为我们合成一个
与合成的默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数
合成复制构造函数的行为是,执行逐个成员初始化,将新对象初始化为原对象的副本
虽然一般不能复制数组,但如果一个类具有数组成员,则合成复制构造函数将复制数组,复制数组时
合成复制构造函数将复制数组的每一个元素
逐个成员初始化最简单的概念模型是,将合成复制构造函数看作这样一个构造函数:其中每个数据成
员在构造函数初始化列表中进行初始化
虽然也可以定义接受非 const 引用的复制构造函数,但形参通常是一个 const 引用
因为用于向函数传递对象和从函数返回对象,该构造函数一般不应设置为 explicit
有些类必须对复制对象时发生的事情加以控制,这样的类经常有一个数据成员是指针,或者有成员表
示在构造函数中分配的其他资源,而另一些类在创建新对象时必须做一些特定工作,这两种情况下,
都必须定义复制构造函数
为了防止复制,类必须显式声明其复制构造函数为 private
类的友元和成员仍可以进行复制,如果想要连友元和成员中的复制也禁止,就可以声明一个
(private)复制构造函数但不对其定义
一般来说,最好显式或隐式定义默认构造函数和复制构造函数,只有不存在其他构造函数时才合成默
认构造函数。如果定义了复制构造函数,也必须定义默认构造函数
#include <iostream> #include <string> #include <fstream> #include <vector> using namespace std; struct NoName { NoName(): pstring(new string), i(0), d(0) { } NoName(const NoName& noName): i(noName.i), d(noName.d) { *pstring = *(noName.pstring); } private: string *pstring; int i; double d; }; class Foo { public: Foo(); // default constructor Foo(const Foo&); // copy constructor // ... }; int main() { string null_book = "9-999-99999-9"; // copy-initialization string dots(10, '.'); // direct-initialization string empty_copy = string(); // copy-initialization string empty_direct; // direct-initialization ifstream file1("filename"); // ok: direct initialization //ifstream file2 = "filename"; error: copy constructor is private // default string constructor and five string copy constructors invoked vector<string> svec(5); return 0; }
发表评论
-
析构函数 管理指针成员
2008-02-23 20:10 4357析构函数就是这样的一个特殊函数,它可以完成所需的资源回收,作为 ... -
友元 static 类成员
2008-02-17 21:09 4487友元机制允许一个类将 ... -
名字查找 构造函数 explicit
2008-02-16 20:50 3936每个类都定义了自己的 ... -
成员函数 this指针 可变数据成员
2008-02-16 00:11 4116类的成员函数可以访问 ... -
类class(一)
2008-02-14 23:30 3525最简单地说,类就是定义了一个新的类型和一个新作用域每个类可以没 ... -
输入输出IO
2008-02-12 22:00 4168每一个 IO 头文件都定义了 char 和 wchar_t 类 ... -
函数function
2008-02-12 21:57 3389函数由函数名以及一组操作数类型唯一地表示。函数的操作数,也即形 ... -
语句(...)
2008-02-12 21:55 4162简单语句C++ 中,大多数 ... -
表达式
2008-02-12 21:52 3161表达式由一个或多个操 ... -
数组和指针
2008-02-12 21:48 5107数组是由类型名、标识符和维数组成的复合数据类型数组也是一种存储 ... -
标准库类型
2008-02-12 21:35 3027string 类型支持长度可变 ... -
变量和基本类型
2008-02-12 21:12 3895类型是所有程序的基础,类型告诉我们数据代表什么意思以及可以对数 ... -
Hello world续
2008-02-04 00:15 2847/*the first C++ program*/ #inc ... -
经典再现 Hello world
2008-02-03 01:54 3722语言:ANSI C++,即标准C++编译和运行环境:红旗 Re ...
相关推荐
详细介绍了构造函数、复制构造函数、拷贝构造函数之间的区别
map使用std::map, CArray,int> > 错误, 解决: 重写CArray, 重载构造函数并加const 添加操作 operator =
C++类和对象练习 构造函数 复制构造函数 缺省参数列表
c++中关于变量声明与复制构造函数的使用
C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解
C++构造函数,复制构造函数和析构函数专题[1].pdf C++继承,虚函数与多态性专题.pdf
关于构造函数的问题,本文是关于构造函数的专题,集中介绍了默认构造函数,初始化列表,重点介绍了复制构造函数, 直接初始化,复制初始化,赋值,临时对象之间的关系,本文内容全面,简单易懂。 本文内容完全属于...
总有人会不很了解复制构造函数的用法,通过实例就可以清除了解其用法。
C构造函数复制构造函数和析构函数专题修订版.pdf
在C++中,只有单个形参,而且该类型是对本类类型的引用(常用const修饰),这样的构造函数称为复制构造函数。 复制构造函数既可以自己定义又可以像默认构造函数一样被编译器隐式调用。但大多数时候,特别是类中...
C++构造函数、复制构造函数和析构函数专题(修订版).pdf
C++构造函数、复制构造函数和析构函数专题(修订版)[汇编].pdf
复制构造函数引用this指针静态成员.ppt
C++语言程序设计:第3讲 复制构造函数.ppt
C++类用三个特殊的成员函数:复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程。本篇文章将介绍复制构造函数。 复制...
本程序包含构造函数和析构函数,可以把构造函数和析构函数的作用区分开
关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义、调用时机、也对编译器合成的复制构造函数行为做了简单说明。本文因需要会涉及到上文的一些...
这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义; 2.复制构造函数和重载赋值操作符的调用时机; 3.复制构造函数和重载赋值操作符的实现要点; 4....
在函数中自动调用复制构造函数 #include #include #include using namespace std; class A { public: A(string name):_name(name) { cout << 类名为: << _name << ,调用构造函数,构造对象地址...