何时调用C++复制构造函数和拷贝构造函数(转)

1. 何时调用复制构造函数

复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中,而不是常规的赋值过程中。类的复制构造函数原型通常如下:

class_name(const class_name&);

它接受一个指向类对象的常量引用作为参数。例如,String类的复制构造函数的原型如下:

String(const String&);

新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。这在很多情况下都可能发生,最常见的情况是将新对象显示地初始化为现有的对象。例如,假设motto是一个String对象,则下面4种声明都将调用复制构造函数:

String  ditto(motto);

String  metoo = motto;

String  also = String(motto);

String  *pString = new String(motto);

其中中间的2种声明可能会使用复制构造函数直接创建metto和also,也可能会使用复制构造函数生成一个临时对象,然后将临时对象的内容赋给metoo和also,这取决于具体的实现。最后一种声明使用motto初始化一个匿名对象,并将新对象的地址赋给pString指针。

2. 何时调用赋值构造函数

赋值构造函数是通过重载赋值操作符实现的,这种操作符的原型如下:

Class_name& Class_name::operator=(const Class_name&);

它接受并返回一个指向类对象的引用。例如,String 类的赋值操作符的原型如下:

String& String::operator=(const String&);

将已有的对象赋给另一个对象时,将使用重载的赋值操作符:

String headline1("test");

String knot;

knot = headline1;

初始化对象时,并不一定会使用赋值操作符:

String metoo = knot;

这里,metoo是一个新创建的对象,被初始化为knot的值,因此使用复制构造函数。不过,正如前面指出的,实现时也可能分两步来处理这条语句:使用复制构造函数创建一个临时对象,然后通过赋值将临时对象的值复制到新对象中。这就是说,初始化总是会调用复制构造函数,而使用=操作符时也可能调用赋值操作符

实例代码如下:

#include <iostream>
using namespace std;
class Test
{
public:
    Test();
    ~Test();
    Test(const Test& t);
    Test& operator=(const Test& t);
private:
    int t1;
};
Test::Test()
{
    cout<<"调用构造函数"<<endl;
}
Test::~Test()
{
    cout<<"调用析构函数"<<endl;
}
Test::Test(const Test& t)
{
    cout<<"调用复制构造函数"<<endl;
}
Test& Test::operator =(const Test& t)
{
    cout<<"调用赋值构造函数"<<endl;
    t1 = t.t1;
    return *this;
}
void main()
{
    Test t1;
    Test t2 = t1;
    Test t3;
    t3 = t1;
}

输出如下:

调用构造函数
调用复制构造函数
调用构造函数
调用赋值构造函数
调用析构函数
调用析构函数
调用析构函数

时间: 2024-12-29 06:39:04

何时调用C++复制构造函数和拷贝构造函数(转)的相关文章

C++复制控制:拷贝构造函数

一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类型的对象显式或隐式初始化一个对象. (2)复制一个对象将它作为实参传给一个函数. (3)从函数返回时复制一个对象. (4)初始化顺序容器中的元素. (5)根据元素初始化式列表初始化数组元素. 下面分别对以上5点进行说明. 1.对象的定义式. C++支持两种初始化形式:直接初始化和复制初始化.复制初始

构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序

构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 对象是由“底层向上”开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明0,就调用直接基类的默认构造函数.在对象析构时,其顺序正好相反.   下面简单介绍下这三个函数. 构造函数       1.构造函数不能有返回值  

C++中构造函数,拷贝构造函数,析构函数

C++中默认构造函数就是没有形参的构造函数.准确的说法,按照<C++ Primer>中定义:只要定义一个对象时没有提供初始化式,就是用默认构造函数.为所有 的形参提供默认实参的构造函数也定义了默认构造函数. 合成的默认构造函数,即编译器自动生成的默认构造函数.<C++ Primer>中的说明:一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数.这条规则的根据是,如果一个类再某种情况下需要控制对象初始化,则该类很可能在所有情况下都需要控制.只有当一个类没有定义构造函数时,

C++构造函数和拷贝构造函数详解

构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数). 对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A(void); // 缺省的无参数构造函数 A(const A &a); // 缺省的拷贝构造函数 ~A(void); // 缺省的析构函数 A & op

C++ 构造函数_拷贝构造函数

拷贝构造函数 系统自动生成的函数: 普通构造函数 拷贝构造函数 如果自己定义了普通构造函数,系统不会再自动生成普通构造函数: 如果自己定义了拷贝构造函数,系统不会再自动生成拷贝构造函数. ***如果没有自定义的拷贝构造函数则系统自动生成一个默认的拷贝构造函数. ***当采用直接初始化或者复制初始化实例对象时,系统自动调用拷贝构造函数. 拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象.拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创

CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数

类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 class Person{ public : Person():age(10), name(NULL); Person(int myage, char *myname); Person(const Person &a); ~Person(void); void set_age(int myage); void get_age(void); void set_other_age(Person &a, int b); private: i

构造函数(三) 拷贝构造函数

什么是拷贝构造函数 拷贝听起来真高级 拷贝构造函数形如 class_name(const class_name &object_name) 拷贝构造函数是一种特殊的构造函数,只有一个参数,这个参数是本类中的一个对象,以引用的形式传参,一般用const修饰,使参数值不变. 如果没有定义拷贝构造函数,编译器会自动隐式生成一个拷贝构造函数,用来简单的复制类中每个成员变量. 一个简单的类对象拷贝 #include <bits/stdc++.h> using namespace std; cla

c++ 构造函数,拷贝构造函数,析构函数与赋值操作符

题目: 为下面的Rectangle类实现构造函数,拷贝构造函数,赋值操作符,析构函数. class Shape { int no; }; class Point { int x; int y; }; class Rectangle: public Shape { int width; int height; Point * leftUp; public: Rectangle(int width, int height, int x, int y); Rectangle(const Rectang

C++学习之构造函数、拷贝构造函数

引申问题一:拷贝构造函数中参数是否加const对拷贝构造函数的影响. 网上大多数人对于这个问题的解释只能达到"当你不想对参数进行修改时,就需要加上const关键字"的程度,但是并没有仔细区分这两种情况到底有什么区别.以下面的程序为例: Dog.h #ifndef __test_header__Dog__ #define __test_header__Dog__ #include <stdio.h> class Dog{ public: Dog(); Dog(Dog &

构造函数、拷贝构造函数、析构函数

构造函数:在对象被创建时利用特定的初始值构造对象,即初始化对象. 拷贝构造函数:用一个已经存在的对象去初始化另一个对象,这两个对象的类型应该是一样的. 格式: class 类名 { public: 类名(形参);                 //构造函数 类名(类名 &对象名);    //拷贝构造函数 ... }; 类名::类名(形参)            //构造函数的实现 { 函数体 } 类名::类(类名 &对象名)      //拷贝构造函数的实现 { 函数体 } 构造函数在