想用机器人赋能未来,少不了扎实的编程的基本功,让我们跟着清华大学的C++语言程序设计课程一起过一遍C++的语法知识吧!
当定义基本类型的变量时,经常会用已有的变量去初始化新定义的变量,当定义对象的时候也有类似的需求,这时候就需要复制构造函数。
1复制构造函数复制构造函数是一种特殊的构造函数,其形参为本类的对象引用。作用是用一个已存在的对象去初始化同类型的新对象。
Class 类名{Public:类名(形参);//构造函数类名(const 类名 &对象名);//复制构造函数};类名::类(const 类名 &对象名)//复制构造函数的实现{函数体}
复制构造函数被调用的三种情况
一、定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
二、如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;
三、如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时的无名对象传递给主调函数,此时发生复制构造。
隐含的复制构造函数
如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的复制构造函数。
这个构造函数执行的功能是:用初始值对象的每个数据成员,初始化将要建立的对象的对应的数据成员。
如果不希望对象被复制构造
C++98做法:将复制构造函数声明为private,并且不提供函数的实现。
C++11做法:用”=delete”指示编译器不生成默认复制构造函数。
例:
Class Point {//Point 类的定义public:Point(int xx=0,int yy=0){ x = xx;y=yy;}Point(const Point&p)=delete;//指示编译器不生成默认复制构造函数private: int x,y;};
下面对以上三种情况举例说明
输出结果
输出结果
输出结果
2析构函数完成对象被删除前的一些清理工作
在对象的生存期结束的时候系统自动调用析构函数。
如果程序中未申明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空。
析构函数的原型
~类名();
析构函数没有参数,没有返回类型。
析构函数完成了什么功能:
第一部分,是写在~类名(){}的大括号里面的内容,这部分由程序员操作,一般执行以下几点。
释放内存。delete或者free所有在这个对象生存期间产生的堆内存;
释放句柄。如各种文件(FILE *)、窗口(HANDLE)等;
catch所有的异常(调用的函数有可能产生异常),不可以让异常逃离析构函数。