关于C++的类的几点注意点

  1. 析构函数绝对不会有返回值,也没有任何参数,绝对不可能重载
  2. 析构函数用于释放在构造函数或对象生命周期内分配的资源,在对象结束生命后会自动调用析构函数来善后。感觉一般都是我们在构造对象的时候,在对象内部要手动申请一块内存,然后我们在析构函数中需要将其释放掉
  3. 即使是自己定义的类,C++也提供默认的成员逐一初始化。比如下面的代码
    MyClass zhangsan;
    MyClass lisi= zhangsan;
    MyClass wangwu;
    wangwu=lisi;

以上代码都可以在VS2015上编译通过。其具体在内部执行的动作是:
- 让lisi wangwu都具有MyClass对应的成员变量和成员函数。
- 将zhangsan中成员变量的值赋给lisi wangwu
- 注意:对于类中自己申请的内存,eg:

int *ptr =new int[20];

在默认类之间初始化的时候,lisi只会新建一个指针ptr,分配指针所占的内存空间,同时将指针的值取值为 zhangsan的ptr的值,也就是会指向zhangsan分配的内存空间上去(new int[20])。当zhangsan这个对象的生命周期结束之后,调用析构函数导致ptr指向的我们自己分配的内存被释放掉的时候,lisi的ptr指向的内存就没有意义了。
我觉得这种情况最容易出现在函数结束的时候返回值为类的时候。因为就是在函数调用结束的时候会发生部分对象生命周期结束(局部变量),而部分任然保留。
而在对象生命周期上,我们可以总结以下几点

1) 如果在一个函数中定义了一个对象(auto 局部变量),当这个函数运行结束时,对象就会被销毁,在对象被销毁前自动执行析构函数。

2) static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数,只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数。

3) 如果定义了一个全局对象(类似于在main函数中定义了一个变量),也只有在程序结束时才会调用该全局对象的析构函数。

4) 如果用 new 运算符动态地建立了一个对象,当用 delete 运算符释放该对象时,先调用该对象的析构函数。

因此为了解决上诉问题,我们不妨自己去写类之间的互相赋值和互相初始化函数,C++为我们提供了这样的功能。
对于用类的一个对象初始化另外一个对象,我们可以自己写如下函数

MyClass::MyClass(const MyClass &inputobjest)
{
    this->age=inputobjest.age;
    this->ptr =new int[20];
    for(int i=0;i<20;i++)
    {
        this->ptr[i]=inputobjest[i];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值