C++中拷贝构造函数的使用

简介: C++中拷贝构造函数的使用

目录

一、拷贝构造函数的概念

二、拷贝构造函数的初识

三、拷贝构造函数定义方法

四、 拷贝构造函数调用的条件

五、拷贝构造函数必须以引用的形式传递(参数为引用值)。

一、拷贝构造函数的概念

拷贝构造函数是一种特殊的构造函数,拷贝构造函数的作用是在创建一个新对象是,使用一个已经存在的对象去初识化这个新对象,

下面我来举一个例子:

Point p2(p1)

这个的作用是在创建p1这个新对象的时候使用本来就存在的对象p2去初始化p1,在这个初始化的过程中我们就需要调用到拷贝构造函数

二、拷贝构造函数的初识

  1. 由于拷贝构造函数也是一种构造函数,所以它的函数名也是要和类名相等的,并且也是没有返回值的
  2. 拷贝构造函数只有一个同类对象引用的参数
  3. 每个类必须要有一个拷贝构造函数,我们可以自定义拷贝构造函数,也可以不自定义使用系统随机自动生成的一个默认的拷贝构造函数

三、拷贝构造函数定义方法

自定义拷贝构造函数的一般形式:

类名::类名(const 类名 &对象名){
    拷贝构造函数的函数体
    ……………………
}

下面我们就来举一个简单的例子

#include <iostream>
using namespace std; 
class Score {
  private:
    int age, score;
  public:
    Score(int a, int s);  //创建一个自定义的构造函数
    ~Score();       //首先声明一个析构函数
    Score(const Score& p);  //自定义的拷贝构造函数
    void print_age();     //输出对象的年龄
};
Score::Score(int a, int s) {
  cout << "我是构造函数,现在已执行……" << endl;
  age = a;
  score = s;
}
Score::~Score() {
  cout << "对象注销,现在自动执行析构函数了……" << endl;
}
Score::Score(const Score& p) {
  age = p.age;
  score = p.score;
  cout << "拷贝构造函数已经使用……" << endl;
}
void Score::print_age() {
  cout << age << endl;
}
int main() {
  Score score2(18, 100);
  Score score3(score2); //调用拷贝构造函数方法一,拷贝score2
  Score score4 = score2;  //调用拷贝构造函数方法二,拷贝score2
  score2.print_age();
  score3.print_age();
  score4.print_age();
}

输出结果:



四、 拷贝构造函数调用的条件

1、当用一个类的对象去初始化同类的另一个对象的时候。正如上面例子的这两条语句:

Score score3(score2); //调用拷贝构造函数方法一,拷贝score2
  Score score4 = score2;  //调用拷贝构造函数方法二,拷贝score2

2、当一个函数的形参是一个类的对象的时候,且调用函数对形参与实参的结合时

3、当函数返回值是一个对象的时候

五、拷贝构造函数必须以引用的形式传递(参数为引用值)。

当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。

相关文章
|
5月前
|
存储 编译器 C++
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
52 0
|
5月前
|
C++ 容器
【C++】拷贝构造函数、拷贝赋值函数与析构函数
【C++】拷贝构造函数、拷贝赋值函数与析构函数
116 6
|
5月前
|
存储 编译器 C++
【C++】:拷贝构造函数和赋值运算符重载
【C++】:拷贝构造函数和赋值运算符重载
30 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++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)
35 0
|
6月前
|
存储 编译器 C++
【c++】拷贝构造函数
【c++】拷贝构造函数
【c++】拷贝构造函数
|
6月前
|
存储 安全 编译器
【c++】类和对象(四)深入了解拷贝构造函数
朋友们大家好啊,本篇内容带大家深入了解拷贝构造函数
【c++】类和对象(四)深入了解拷贝构造函数