只有单个形参,而且该形参是对本类类型对象的引用(常用 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;
}
分享到:
相关推荐
详细介绍了构造函数、复制构造函数、拷贝构造函数之间的区别
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 << ,调用构造函数,构造对象地址...