C++-必知必会_赋值和初始化并不相同(条款12)

本文探讨了C++中赋值与初始化的区别,通过具体的代码示例解释了两者的行为差异,尤其是在用户自定义类型中的表现。文章强调了不当使用可能带来的问题。

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

/***********************************************************************
 * C++必知必会   条款12
 * 赋值和初始化并不相同
 * 
 *        赋值发生在你赋值时,除此之外,遇到所有其它的复制情形均为初始化.包括声明、函数返
 * 回、 参数传递以及捕获异常中的初始化.
**********************************************************************
*/

    
int  a  =   12 ;   // 初始化,将0x000c复制给a
    a  =   12 ;        // 赋值,将0x000c复制给a

    
class  String
    
{
        
private:
            
char *s_;
        
public:
            String(
const char *init);
            String 
&operator = (const char *str);
        
//...
    }
;

    
// 初始化
    String::String( const   char   * init)  // 构造函数
     {
        
if(!init)    init = "";
        s_ 
= new char(strlen(init)+1); //注意这句,赋值里可没有.赋值会假定已经分配内存区域.
        strcpy(s_,init);
    }


    
// 赋值
    String  & String:: operator   =  ( const   char   * str)
    
{
        
if(!str)    str = "";
        
char *tmp = strcpy(new char[strlen(str)+1],str);
        delete[] s_; 
//类似于 析构
        s_ = tmp;    //类似于 构造
        return *this;
    }

/***********************************************************************
 * 赋值有点像一个析构动作后跟了一个构造动作.
 *        目标左侧(this)在采用源(右侧,str)重新初始化之前,必须被清理掉.
 *        由于一个正当的赋值操作会清掉左边的实参,因此永远不要对一个未初始化的存储区执行
 * 用户自定义的赋值操作.
**********************************************************************
*/


    String 
* names  =  static_cast < String *> (:: operator   new (BUFSIZ));
    names[
0 =   " Oh,wrong! " ;     // 赋值 wrong
/***********************************************************************
 *        上例中,因为我们直接调用了operator new,避免了String默认构造函数执行隐式的初始
 * 化,因此names此时指向一块随机们的内存.在执行赋值操作时,试图执行delete[]操作,出错!
**********************************************************************
*/
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值