C++请不要问我string s=”a”+”b”分配了几次内存 首先我要告诉你,string s="a"+"b";在C++中连编译都通过不了,错误提示:“+:不能添加两个指针”。你说他分配几次内存。为什么报错呢,原因很简单,”a”是一个字符数组,字符数组没有自己的加法运算符。你硬是要这么写,自己实现去,当然在java,js,C#(我还是个C#程序员啊,什么时候才能成为C++程序员呢?哥带着这个难题一直在学习C++)中这句话是正确的。那是因为这些语言把一些基础的东西都封装了,或者说这些语言实现了字符数组的加法运算符。 当我们把这句话改成string a=”a”;string s=a+”b”;就没有问题了。现在a是一个字符串,有现成的加法运算符,加法运算符的右边参数应该为字符串,字符数组,字符,指向字符串的指针等,右边参数为int,bool型的没有重载。 那么这两句话到底分配了几次内存呢,有人说2次,有人说3次。我说4次。 有人说编译器优化,只需要1次,编译器优化我真的管不了。 说2次的人可能认为:“a”一次,”b”一次,共两次 说3次的人可能认为:“a”一次,”b”一次,”a”+”b”要分配一块新的内存。因为必须重新分配一块内存,来存储”ab”。如果是a+=b;就不用了,编译器会把a+b的值存在a所在的空间中,如果空间不够,应该会分配一块更大的内存来存储a+b的值(存不下,不给一块更大的空间,行吗?)。 以上三次是必须,第四次分配内存发生在将a+b的值赋给s,即s=”ab”。我是在反复看Effective C++时不经意间发现的。Effective C++中条款15: 让operator=返回*this的引用,解释得非常清楚。我在这里简要说一下。 string类的operator=的源码大致如下: