C++篇之构造函数、析构函数和拷贝构造函数

构造函数:

构造函数负责创建对象和初始化对象,在用默认的构造函数创建对象时,如果创建的是全局对象或
静态对象,则对象的值全为0,否则对象的值是随机的,和C语言中定义的变量一样(类也是一
个类型)。建立对象的同时会自动调用构造函数。

构造函数的规则:
构造函数和类的名字一样并且没有返回值,可以有参数也可以没有参数,也可以有默认值。主要是
为数据赋初值。构造函数可以重载。
构造函数的初始化列表:
构造函数的初始化列表中的数据的初始化顺序和声明的相同。
const数据成员必须使用初始化列表进行初始化。
这里写代码片
class Student
{
    public:
        Student(int m_id = 0,int m_score = 0);//:id(m_id),score(m_score);
        //这里的默认参数不能少,因为下面的main函数中定义了一个对象没有赋初值
        ~Student();        
        Student(const Student& pt);

        int getid(void);
        int getscore(void);
        static int getnum(void);

    private:
        int id;
        int score;
        static int num;     
};
Student::Student(int m_id ,int m_score ):id(m_id),score(m_score)
    {
        num++;  
        id = m_id;
        score = m_score;
    }
    注意:构造函数的初始化列表要和构造函数的实体写在一起,不能写到声明里面去。
    默认参数在实体或声明中都行

    public:
        Student(int m_id  ,int m_score  );//:id(m_id),score(m_score);
        ~Student();        
        Student(const Student& pt);

    Student::Student(int m_id = 0,int m_score = 0):id(m_id),score(m_score)
    {
        ...
    }
    注意:默认参数要么在声明里(第一种)要么在函数的实体里的形参里(第二种),两者
    是或的关系。而初始化列表必须和函数的实体在一起,要么不用初始化列表。

析构函数:

一个类可能在构造函数里分配资源也就是内存(如果有数据的话),这些资源需要在对象不复存在
之前被释放,也就是这个对象的生命周期结束的时候,由系统自动调用,,析构函数没有返回值类
型,没有参数,也没有重载。如果没有自定义析构函数,则编译器提供一个默认的析构函数。

拷贝构造函数:

    Student(const student&)//拷贝构造函数的形式
    拷贝函数具有单个形参,并且这个形参是对该类型的引用。
    1.当定义一个新对象并用同一个类型的对象对它初始化时,将显示调用拷贝构造函数。比如:
    Student s1("joe");
    Student s2 = s1;//这时调用拷贝构造函数
    Student s3("tom");
    s2 = s3;//这时会调用赋值运算符
    2.拷贝一个临时对象时,比如:
    void foo(Student stu);
    foo(s1);//这里会调用拷贝构造函数,传递s1的一个副本,传递副本的时候会调用拷贝
    构造函数
    3.Student bar();
    Student tom = bar();这时会调用拷贝构造函数

    什么时候需要拷贝构造函数呢?(有的需要,有的不需要)
    1.当类数据成员有指针时需要定义拷贝构造函数和定义赋值运算符
    2.当类数据成员管理资源,比如打开一个文件,申请一块内存区域...

    C++为什么要定义拷贝构造函数?
    这里涉及到深拷贝与浅拷贝的问题(浅拷贝就是两个指针指向同一块资源,深拷贝就是两个
    指针指向两块资源,这两块资源的内容一样),默认的拷贝构造函数是浅拷贝,如果涉及到
    指针,同一块资源会被析构两次,会出现问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值