`
clskkk2222
  • 浏览: 34905 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

复制构造函数

    博客分类:
  • C++
阅读更多

只有单个形参,而且该形参是对本类类型对象的引用(常用 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;
}

 

 

0
0
分享到:
评论
1 楼 NeuronR 2009-07-16  
引用
因为用于向函数传递对象和从函数返回对象,该构造函数一般不应设置为 explicit


为什么不以置为 explicit?
返回对象又是何意呢?

相关推荐

    没有可用的复制构造函数或复制构造函数声明

    在C++编程中,"没有可用的复制构造函数或复制构造函数声明"是一个常见的错误,通常出现在尝试复制一个对象,而该对象的类没有定义复制构造函数时。在这个特定的情境中,问题出在一个名为`CArray, int&gt;`的自定义数组...

    构造函数和复制构造函数

    构造函数和复制构造函数的详细介绍 构造函数是C++中的一种特殊函数,它们的主要作用是初始化对象的状态,并将对象的成员变量初始化为合适的值。构造函数的名称与类名相同,没有返回值(包括void),且只能被调用一...

    有关复制构造函数和变量声明

    有关复制构造函数和变量声明 在 C++ 编程语言中,复制构造函数和变量声明是两个非常重要的概念。复制构造函数是类对象之间的复制过程,而变量声明是变量的定义和初始化过程。本文将详细介绍复制构造函数和变量声明...

    人员类 c++(构造函数 复制构造函数 缺省参数列表)

    C++类和对象练习 构造函数 复制构造函数 缺省参数列表

    C++复制构造函数详解

    在C++编程语言中,复制构造函数是一种特殊的构造函数,它的主要作用是创建一个对象的新副本。当一个已存在的对象被用作创建新对象的初始值时,复制构造函数会被调用。理解复制构造函数的工作原理及其应用是C++程序员...

    C++构造函数,复制构造函数和析构函数专题[1].pdf

    在C++编程语言中,构造函数、复制构造函数和析构函数是面向对象特性的重要组成部分,它们在对象的生命周期管理中扮演着至关重要的角色。同时,继承、虚函数和多态性是C++实现面向对象设计的核心概念。下面将详细讨论...

    复制构造函数的用法实例

    总有人会不很了解复制构造函数的用法,通过实例就可以清除了解其用法。

    C构造函数复制构造函数和析构函数专题修订版.pdf

    C构造函数复制构造函数和析构函数专题修订版.pdf

    C++中何时调用复制构造函数

    在C++中,只有单个形参,而且该类型是对本类类型的引用(常用const修饰),这样的构造函数称为复制构造函数。  复制构造函数既可以自己定义又可以像默认构造函数一样被编译器隐式调用。但大多数时候,特别是类中...

    C++构造函数、复制构造函数和析构函数专题(修订版).pdf

    C++构造函数、复制构造函数和析构函数专题(修订版).pdf

    C++构造函数、复制构造函数和析构函数专题(修订版)[汇编].pdf

    C++构造函数、复制构造函数和析构函数专题(修订版)[汇编].pdf

    复制构造函数引用this指针静态成员

    复制构造函数引用this指针静态成员.ppt

    C++语言程序设计:第3讲 复制构造函数.ppt

    C++语言程序设计:第3讲 复制构造函数.ppt

    包含构造函数和析构函数的C++程序

    ### 构造函数和析构函数在C++中的应用 #### 概述 构造函数与析构函数是C++编程语言中非常重要的概念,它们在类的实例化和销毁过程中扮演着关键角色。通过理解这些函数的工作原理及其作用,我们可以更好地控制对象...

    C++复制控制之复制构造函数

    C++类用三个特殊的成员函数:复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程。本篇文章将介绍复制构造函数。  复制...

    构造函数实例(源码)

    在本实例中,我们将深入探讨四种主要类型的构造函数:默认构造函数、初始化构造函数、复制构造函数和转换构造函数。 首先,我们来讨论默认构造函数。默认构造函数是没有任何参数的构造函数,它通常用来创建一个不带...

    编译器角度看C++复制构造函数

    关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义、调用时机、也对编译器合成的复制构造函数行为做了简单说明。本文因需要会涉及到上文的一些...

Global site tag (gtag.js) - Google Analytics