第六讲:构造拷贝析构

本文详细讲解了C++中的拷贝构造函数和析构函数,包括它们的作用、调用时机以及默认行为。重点阐述了拷贝构造函数在对象初始化和函数参数传递时的使用,以及析构函数在对象生命周期结束时自动调用的特点。同时,讨论了构造函数和析构函数的执行顺序,并提醒读者注意不同作用域和存储类别的对象,其构造和析构的顺序可能有所不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第六讲:构造拷贝析构


  • 拷贝构造函数
  • 析构函数
  • 构造函数与析构函数的执行顺序

拷贝构造函数

  • 拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用
class 类名 {
public :
    类名(形参);//构造函数
    类名(类名 &对象名);//拷贝构造函数
           ...
};
类名::类(类名 &对象名)//拷贝构造函数的实现
{    函数体    }

class Point {
public:
    Point(int xx=0, int yy=0) { x = xx; y = yy; }
    Point(Point& p);
    int getX() { return x; }
    int getY() { return y; }
private:
    int x, y;
};

Point::Point (Point& p) {
  x = p.x;
  y = p.y;
  cout << "Calling the copy constructor "   << endl;
}
  • 当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值

    int main() {
    Point a(1,2);
    Point b = a; //拷贝构造函数被调用
    cout << b.getX() << endl;
    }

  • 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数

void fun1(Point p) {
  cout << p.getX() << endl;
} 
int main() {
  Point a(1, 2);
  fun1(a); //调用拷贝构造函数
  return 0;
}  
  • 当函数的返回值是类对象时,系统自动调用拷贝构造函数,例如:
Point fun2() {
  Point a(1, 2);
  return a; //调用拷贝构造函数
}
int main() {
  Point b;
  b = fun2();
  return 0; 
}
  • 隐含的拷贝构造函数
    • 如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的拷贝构造函数。
    • 这个构造函数执行的功能是:用作为初始化值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。

析构函数

  • 完成对象被删除前的一些清理工作
  • 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
  • 如果程序中未声明析构函数,编译器将自动产生一个隐含的析构函数

  • 析构函数说明格式:~ <类名>();

    • 注意事项:
      1. 函数名与类名相同,只是在前边加“~”符号;
      2. 析构函数不得返回任何值,没有返回类型;
      3. 析构函数不得带有任何参数;
      4. 析构函数只有在如下两种情况时才会被自动调用:
        • 当对象定义在一个函数体中,该函数调用结束后,析构函数被自动调用。
        • 用new为对象分配动态内存后,当使用delete释放对象时析构函数被自动调用。
      5. 如果没有定义任何析构函数,则编译器自动为类生成一个默认的析构函数。 如: ~person() { }
      6. 析构函数不能被重载;一个类只能有一个析构函数。
  • 什么时候运行析构函数?

    • 当对象的生命结束时,会自动执行它的析构函数。即当出现以下几种情况,析构函数就会被执行:
      • 如果在函数中定义了一个对象,当函数调用结束时,释放对象前自动执行析构函数。
      • static 局部对象在函数调用结束时,包含的对象不会被释放,只在main函数结束或调用exit函数时,才调用static局部对象的析构函数。
      • 如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束,或exit语句),调用该全局对象的析构函数。
      • 如果用new运算符动态地建立了一个对象,当用delete 运算符释放对象时,先调用该全局对象的析构函数。
  • 调用构造函数和析构函数的顺序

    • 撤消对象的顺序(在同一函数中):先构造的后析构,后构造的先析构。
#include <iostream>  // 例
#include <string>
using namespace std;
class  stud    //声明类
{
public:
    stud(int n,string nam,char s)
    // 构造函数初始化私有成员变量
    {
        num=n;
        name=nam;
        sex=s;
        cout<<"构造函数"<<endl;
    }
    ~stud()   // 析构函数在程序结束时自动调用
    {
        cout<<"销毁stud对象!!!"<<num<<endl;
    }
    void display()
    {
        cout<<"num="<<num<<endl;
        cout<<"name="<<name<<endl;
        cout<<"sex="<<sex<<endl;
    }
private:
    int num;
    string name;
    char sex;
};      // 类定义结束
int main() //  ----- 主函数------
{
    stud st1(10000,"Wang_li",'f');
    st1.display();
    stud st2(11111,"zhang_li",'t');
    st2.display();
    return 0;
}

注意:先构造的后析构,后构造的先析构,并非绝对成立!
对象不同的作用域,不同的存储类别,那么调用构造函数和析构函数的时候也有所不同。
例如:( 了 解 )
一个程序中有多个文件。在多个文件中定义了全局对象,那么这些对象的执行顺序是不确定的;
在函数中定义局部自动对象,如果函数被多次调用
如果函数中定义静态局部对象;那么函数调用结束时对象并不释放,只有main结束或调用exit中才调用析构函。.

构造函数和析构函数举例

#include <iostream>
using namespace std;
class Point
{
public:
    Point(int xx,int yy);
    ~Point();
    //...其他函数原型
private:
    int x, y;
};
Point::Point(int xx,int yy)
{
    x = xx;
    y = yy;
}
Point::~Point()
{
}
//...其他函数的实现略

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值