关于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);
        }

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

时间: 2024-10-13 00:43:04

关于c++的string的operator =的相关文章

为什么operator&gt;&gt;(istream&amp;, string&amp;)能够安全地读入长度未知的字符串?

一般而言,实现"读入用户输入的字符串",程序中自然不能对用户输入的长度有所限定.这在C++中很容易实现,而在C中确没那么容易. 这一疑问,我在刚学C++的时候也在脑中闪现过:不过很快将它抛在脑后了.直到最近,我在百度知道上讨论一个单词统计问题(链接)时,才重新想起.于是,翻出gcc 4.6.1的代码,浏览了一番. 首先,明确这里探讨的场景--从标准输入(或字符模式打开的文件)中读取一个字符串(换行.空格.tab间隔均可).用C++实现这一功能有两种选择--使用C标准库和使用C++标准库

C++ 中 new 操作符内幕:new operator、operator new、placement new

原文链接 一.new 操作符(new operator) 人们有时好像喜欢有益使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: string *ps = new string("Memory Management"); 你使用的new是new操作符. 这个操作符就象sizeof一样是语言内置的.你不能改变它的含义,它的功能总是一样的.它要完毕的功能分成两部分.第一部分是分配足够的内存以便容纳所需类型的对象.

[C++] String Basic

Namespace Declarations A using declaration let us use a name from a namespace without qualify the name with a namespace_name:: prefix. // using namespace::name using std::vector using std::string  A sperate using declaration is required for each name

java int转String所有方式的效率对比与深入解析

在java中,大家肯定都会遇到int类型转String类型的情形,知其然知其所以然,总结加分析一下,int类型转String类型有以下几种方式: a+"" String.valueOf(a) Integer.toString(a) 以上三种方法在实际使用过程中都是没有问题的,但是效率上还是有些许差别的,所以写个小程序来对比一下他们的效率: int a = 123456789; long start = System.currentTimeMillis(); for (int i=0;

《Just For Java——基础扎实》——第二节:String

一.String简介 包:java.lang.String,java.lang提供利用 Java 编程语言进行程序设计的基础类. 实现:public final class String  implements java.io.Serializable, Comparable<String>, CharSequence{ } 其中:java.io.Serializable  是序列化有关的接口:   java.lang.CharSequence  是cahr值的一个可读序列: java.lan

String源码

/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.lang; import java.io.ObjectStreamClass;import java.io.ObjectStreamField;import java.

string类的实现

class String { public: String(const char*str = NULL);// 普通构造函数 String(const String &other);    // 拷贝构造函数 ~ String(void);    // 析构函数 String & operate =(const String &other);// 赋值函数 String operator+(const String&other)const;//operator+ bool

string实现

#include<iostream> using namespace std;   class String{     friend ostream& operator<< (ostream&,String&); public:     String(const char* str=NULL);                //赋值构造兼默认构造函数(char)     String(const String &other);           

自己实现的string类

自己实现的一个string类,包括基本构造,复制构造,赋值和析构函数,比较函数,输入输出函数,锻炼一下动手能力. #include <iostream> #include <cstring> #include <iomanip> using namespace std; class MyString{ public: MyString(const char *s=NULL); MyString(const MyString& rhs); MyString&