zoukankan      html  css  js  c++  java
  • 关于c++的string的operator =

    在 c++ primer 5 中在说到string的章节里面有这样一句话:

    string s5 = "hiya";  // copy initialization

    也就是说,这里说上面这句是拷贝初始化,也就是调用拷贝构造函数。而下面这句:

    string s6("hiya"); // direct initialization
    却又是直接初始化,然后我就再想,在 c++ 的初始化里面上面这两种不是等效的么?另外我也很好奇在string的实现里面 string s5 = "hiya"; 如果真的是拷贝初始化的话有没有中间生成一个临时变量(虽然不太可能,这样写效率显然很低)。于是去看 SGI STL的源码,找到关于 operator = 的部分是这样的:
      basic_string& operator=(const _CharT* __s)  // wc: = char*
        { return assign(__s, __s + _Traits::length(__s)); }

    显然这里可以说明没有中间变量的产生。

    后面我是用这两种方式在 vs 下面单步调试的:

    int main(int argc, char* argv[])
    {   
        int a = 0;
       string str = "wc";
       string str2("wcww");
         
        return 0;
    } 

    然后发现这两种初始化语句进入的构造函数是相同的,都是下面这个:

        basic_string(const _Elem *_Ptr)
            : _Mybase()
            {    // construct from [_Ptr, <null>)
            _Tidy();
            assign(_Ptr);
            }

    而这个并不是什么拷贝构造函数,就是一般的构造函数而已。所以最上面两句的构造都属于直接构造而没有拷贝构造。

  • 相关阅读:
    中国大概可用NTPserver地址
    ROOT android 原则。 基于(zergRush)
    Struts2他们拦截器实例定义—登陆权限验证
    引用与指针
    address_space 从哪里来
    C++ 可以多个函数声明
    linux下远程管理利器-tmux
    内核空间和用户空间的分界 PAGE_OFFSET
    io端口
    C中程序的内存分配
  • 原文地址:https://www.cnblogs.com/xiezhw3/p/3983592.html
Copyright © 2011-2022 走看看