C++ 拷贝构造函数剖析

简介: C++ 知识点精析

拷贝构造函数

知识点:

解释:拷贝构造函数是一种特殊的构造函数,它具有一般构造函数的所有特性,但其形参是本类对象的引用。

作用:使用一个已经存在的对象(由拷贝构造函数参数指定)去初始化同类的一个新对象。

定义格式:构造函数名 (&类名);

三种使用情况:

  1. 用一个对象去初始化同类的另一个对象;
  2. 函数的形参是类的对象,调用函数时形参与实参的结合;
  3. 函数返回值是类的对象,函数执行返回调用;

注意:

  1. 拷贝构造函数的参数采用引用方式。若把一个真实的类对象作为参数传到拷贝构造函数,引起无穷递归;

    1. 拷贝构造函数的名字必须与类名相同,且无返回值;

      1. 拷贝构造函数只有一个参数,必须为本类对象的引用;
      2. 每一个类必须有一个拷贝构造函数。若用户定义类时未给出拷贝构造函数,则系统会自动产生一个缺省的拷贝构造函数;

该例重点阐述:为什么拷贝构造函数的参数必须为同类对象的引用?

#include <iostream>
using namespace std;

class Complex {
    private:
        double real, image;
    public:
        Complex(double r, double i);   //声明构造函数
        Complex(Complex &c);           //声明拷贝构造函数 
        Complex add(Complex c);
        void Output();
};

Complex::Complex(double r, double i): real(r), image(i) {   //构造函数初始化列表
    cout << "调用两个参数的构造函数" << endl;
}

Complex::Complex(Complex &c) {
    real = c.real;
    image = c.image;
    cout << "调用拷贝构造函数" << endl;
}

void Complex::Output() {
    cout << "(" << real << "," << image << ")" << endl;
}

Complex Complex::add(Complex c) {
    Complex  y(real + c.real, image + c.image);
    return  y;
}

void f(Complex n) {
    cout << "n=";
    n.Output();
}

int main() {
    Complex a(3.0, 4.0), b(5.6, 7.9);  //创建Complex类的两个对象a,b
    Complex c(a);                      //使用拷贝构造函数,用已创建的对象a初始化要建立的另一个对象c
    cout << "a=";
    a.Output();
    cout << "c=";
    c.Output();
    f(b);
    c = a.add(b);
    c.Output();
}

程序运行结果:

调用两个参数的构造函数
调用两个参数的构造函数
调用拷贝构造函数
a=(3,4)
c=(3,4)
调用拷贝构造函数
n=(5.6,7.9)
调用拷贝构造函数
调用两个参数的构造函数
(8.6,11.9)
  1. 本例中,当程序执行到main()函数 Complex c(a); 语句时,程序会到拷贝构造函数完成“用存在的类对象a,初始化c的工作”。但是,若此时拷贝构造函数的参数是一个真实的类对象而非同类对象的引用,则无法完成对类对象c的初始化工作。
  2. 因为没有一块儿内存空间去接收传递的对象,&c就相当于是a的一个别称,该临时对象用于完成对c的赋值,拷贝构造函数定义中 real=c.real; real就是c的实部,c.real就是用a的实部去给c的实部赋值,虚部部分同理,所以会无限次调用该函数,即引起无穷递归。
相关文章
|
5月前
|
存储 编译器 C++
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
49 0
|
5月前
|
C++ 容器
【C++】拷贝构造函数、拷贝赋值函数与析构函数
【C++】拷贝构造函数、拷贝赋值函数与析构函数
109 6
|
5月前
|
存储 编译器 C++
【C++】:拷贝构造函数和赋值运算符重载
【C++】:拷贝构造函数和赋值运算符重载
29 1
|
5月前
|
存储 编译器 C++
【C++】类和对象③(类的默认成员函数:拷贝构造函数)
本文探讨了C++中拷贝构造函数和赋值运算符重载的重要性。拷贝构造函数用于创建与已有对象相同的新对象,尤其在类涉及资源管理时需谨慎处理,以防止浅拷贝导致的问题。默认拷贝构造函数进行字节级复制,可能导致资源重复释放。例子展示了未正确实现拷贝构造函数时可能导致的无限递归。此外,文章提到了拷贝构造函数的常见应用场景,如函数参数、返回值和对象初始化,并指出类对象在赋值或作为函数参数时会隐式调用拷贝构造。
|
6月前
|
存储 编译器 C++
【C++从练气到飞升】04---拷贝构造函数
【C++从练气到飞升】04---拷贝构造函数
|
5月前
|
程序员 编译器 C++
C++中的构造函数以及默认拷贝构造函数
C++中的构造函数以及默认拷贝构造函数
31 0
|
6月前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
6月前
|
存储 编译器 对象存储
【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)
【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)
34 0
|
6月前
|
存储 编译器 C++
【c++】拷贝构造函数
【c++】拷贝构造函数
【c++】拷贝构造函数
|
6月前
|
存储 安全 编译器
【c++】类和对象(四)深入了解拷贝构造函数
朋友们大家好啊,本篇内容带大家深入了解拷贝构造函数
【c++】类和对象(四)深入了解拷贝构造函数