类和动态内存管理注意的几个问题

1.默认构造函数分为带参数和不带参数两种,在类对象声明时,不能同时匹配两个构造函数,否则会出错!

2.复制构造函数:用于将一个对象复制到新创建的对象中,其原型为:

<span style="white-space:pre">	</span>class_name(const class_name &t)
3.深度复制:如果类对象有一字符串成员char * str;,复制构造函数应当复制字符串并将副本的地址赋给str成员,而不仅仅时复制字符串地址。用于深度复制的构造函数又称为显式复制构造函数。

eg:

string :: string(const stringBad & st)
{
    num_string++;
    len=st.len;
    str=new char[len+1];
    std::strcpy(str,st.str);
}
4.浅复制:仅仅复制指针信息,即字符串地址。用于浅复制的构造函数又称为隐式复制构造函数。

eg:

string :: string(const char * s)
{
    
    len=strlen(s);
    str=new char[len+1]; 
    num_string++; 
    std::strcpy(str,s);
}

5.如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete。

6.new和delete必须相互兼容匹配。new对应delete,new[ ]对应delete[ ].

7.如果有多个构造函数,则必须以相同方式使用new,统一使用new与delete、new[ ]与delete[ ]。因为只有一个析构函数,所有的构造函数必须和它相对应兼容。然而,可以在一个构造函数中使用new初始化指针,而在另一个构造函数中将指针初始化为空(0或C++11中的nullptr),只是因为delete可以用于空指针。

8.应定义一个构造函数,通过深度复制将一个对象初始化为另一个对象。

eg:

string :: string(const stringBad & st)
{
    num_string++;
    len=st.len;
    str=new char[len+1];
    std::strcpy(str,st.str);
}

9.应定义一个赋值运算符,通过深度复制将一个对象初始化为另一个对象。


String & String::operator=(const String & st)
{
    if(this==&st)
        return *this;
    delete [] str;
    len=st.len;
    str=new char[len+1];
    std::strcpy(str,st.str);
    return *this;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/yangquanhui/p/4937514.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值