C++必知必会之(12)赋值和初始化并不相同

来源:互联网 发布:社会赞许性 知乎 编辑:程序博客网 时间:2024/05/21 19:31

1、赋值发生于赋值时,除此之外,遇到的所有其他的复制情形均为初始化,包括声明、函数返回、参数传递以及捕获异常中的初始化。


对于内建类型来说,赋值和初始化的操作区别不明显,只是简单地复制一些位而已。

但对于用户自定义类型来说截然不同。考虑如下简单的非标准字符串类:

class String {

   public:

       String (const char *init );        //故意不标为explicit

       ~String( );

       String(const String &that);

       String  &operator = (const String &that);

       String  &operator = (const char *str);

       void    swap( String &that );

       friend   const   String   operator + ( const String &,  const String & );     //用于连接字符串

       friend bool operator < ( const String &,  const String & );

       //......

    private:

        String ( const char *,  const  char*);       //计算性的构造函数

        char *s_

};


2、采用字符串初始化一个string对象和简单,先分配一个足够大的缓冲区,用于容纳该字符串的复制,然后执行复制动作:

String::String ( const char *init )

{

    if( !init )   init = " ";

    s_ = new char [ strlen(init ) + 1];

    strcpy(s_,  init);

}


析构函数:  String::~String()   {  delete [ ]  s_ };


赋值比构造复杂一些:

String   &String::operator  =  ( const char *str)

{

    if( !str)    str = " ";

    char   *tmp = strcpy( new char[ strlen( str) + 1 ],  str);

    delete [ ] s_;

    s_ = tmp;

    return  *this;

}


3、对于String类型来说,String现有的字符缓冲区在被附加上一个新的字符缓冲区之前必须被释放掉。


由于一个正当的赋值操作会清掉左边的实参,因此永远都不应该对一个为初始化的存储区执行用户自定义赋值操作:

String  *names = statoc_cast<String *> (::operator new( BUFSIZ));

names[0] = "Sakamoto";    //delete[ ] 未被初始化的names!


names指向为初始化的存储区,因为我们调用了operator new,从而避免了通过String的默认构造函数执行的隐式初始化动作,因此names指向一块填充着随机位的内存。

  


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 接到客人电话预定时怎么办 产检资料弄丢了怎么办 工作中同事喜欢争风头怎么办 想出卖身体赚钱了怎么办 孩子生下来不想要了怎么办 舌头被铁管冻住怎么办 人被水泥冻住了怎么办 姑娘果孕妇吃了怎么办 纹身后吃了辣的怎么办 怀孕五个多月不想要了怎么办 失业后又干保安档案怎么办 前列大腺脓肿要怎么办 小动物死了孩子很伤心怎么办 向客人开错房间怎么办 工伤认定没有证人证言怎么办? 一个月没来月经怎么办14岁 刮了胡子下巴痒怎么办 月经多怎么办喝什么好 大姨妈不调怎么办来了 多人被骗没证据怎么办 一直坏肚子拉水怎么办 犯人在监狱有高危高血压怎么办 丈夫出轨他死都不承认怎么办 没写欠条的债该怎么办 被尾随回家知道住处怎么办 微信记录全没了怎么办 微信记录没有了怎么办 ipad登录不了下不了软件怎么办 苹果手机打开自动时间不对怎么办 魅族手机时间不同步怎么办 小米手环时间不准怎么办 电脑网络dns配置错误怎么办 去泰国手机要打电话怎么办 苹果6s音量小怎么办 三星0n7充电慢怎么办 在国外接受不到验证码怎么办 ip地址错误网络无法连通怎么办 注册微信收不到验证码怎么办 安卓手机收不到短信怎么办 手机被短信验证码轰炸怎么办 美国访学一年手机卡怎么办方便