类和对象(3):拷贝构造函数

简介: 类和对象(3):拷贝构造函数

引入:

class Stack
{
public:
  Stack(int capacity = 3)
  {
    _a = (int*)malloc(sizeof(int) * capacity);
    if (nullptr == _a)
    {
      perror("malloc");
      exit(-1);
    }
    _top = 0;
    _capacity = capacity;
  }
  ~Stack()
  {
    free(_a);
    _top = _capacity = 0;
    _a = nullptr;
  }
private:
  int* _a;
  int _top;
  int _capacity;
};
void Func(Stack st)
{
  //...
}
int main()
{
  Stack st1;
  Func(st1);
  return 0;
}

运行结果:

调用Func函数时创建临时Stack类对象st,其中st._ast1._a指向了同一块空间,这块空间在程序运行过程中会被销毁两次。

一、拷贝构造函数

1.1 概念

拷贝构造函数:只有单个形参——对本类类型对象的引用(一般用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用

class Date
{
public:
    // ...
    // 拷贝构造函数
    Date(const Date& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
  }
private:
    int _year;
    int _month;
    int _day;
};
1.2 特性
  1. 拷贝构造函数是构造函数的一种重载形式
  2. 拷贝构造函数只有单个形参必须是类类型对象的引用,使用传值方式编译器会报错(引发无穷递归调用)。

  1. 若未显示定义,编译器会默认生成拷贝构造函数,默认生成的拷贝函数按内存存储、字节序完成拷贝,这种拷贝方式为浅拷贝(或值拷贝)

内置类型的拷贝构造不需要我们自己实现了——类中没有涉及资源申请。

一旦涉及了资源申请,如:引入中的Stack类,则拷贝构造函数一定要写。

class Stack
{
public:
    // ...
    Stack(const Stack& st)
    {
        _a = (int*)malloc(sizeof(int) * st._capacity);
        if (_a == nullptr)
        {
            perror("malloc");
            exit(-1);
    }
        memcpy(_a, st._a, sizeof(int) * st._top);
        _capacity = st._capacity;
        _top = st._top;
  }
};

void Func(Date d)
{
    // ...
}
int main()
{
    Date d1;
    Func(d1);
    return 0;
}

程序真实运行过程:

相关文章
|
10月前
|
编译器 C++
类和对象(2):构造函数,析构函数
类和对象(2):构造函数,析构函数
|
9月前
|
编译器 C++
【C++】类和对象(中)之构造函数与析构函数
【C++】类和对象(中)之构造函数与析构函数
46 0
|
10月前
|
存储 编译器 C++
C++类与对象 - 3(拷贝构造函数和运算符重载)(超详细)(上)
C++类与对象 - 3(拷贝构造函数和运算符重载)(超详细)
40 0
|
3月前
类和对象(7):初始化列表
类和对象(7):初始化列表
|
4月前
|
编译器 C++
【C++类和对象】构造函数与析构函数
【C++类和对象】构造函数与析构函数
【C++类和对象】构造函数与析构函数
|
4月前
|
存储 安全 编译器
【c++】类和对象(四)深入了解拷贝构造函数
朋友们大家好啊,本篇内容带大家深入了解拷贝构造函数
【c++】类和对象(四)深入了解拷贝构造函数
|
4月前
|
存储 编译器 C语言
【c++】类和对象(二)this指针
朋友们大家好,本节内容来到类和对象第二篇,本篇文章会带领大家了解this指针
【c++】类和对象(二)this指针
|
4月前
|
编译器 C语言 C++
【c++】类和对象(三)构造函数和析构函数
朋友们大家好,本篇文章我们带来类和对象重要的部分,构造函数和析构函数
|
4月前
|
存储 编译器 C语言
【C++】类和对象之构造函数、析构函数、拷贝构造函数(二)
【C++】类和对象之构造函数、析构函数、拷贝构造函数(二)
|
4月前
|
C++
C++——类和对象之拷贝构造
C++——类和对象之拷贝构造