这个实现中,首先检查 pos
是否超出字符串范围。如果是,则抛出 异常。接着,根据 len
的值计算子串的长度,确保不会越界。然后,创建一个新的字符串对象 sub
来存储子串,并通过循环将子串的字符一个一个地复制到 sub
中。最后,返回 sub
。
当我们return tmp时,返回的是tmp临时拷贝对象,当tmp
对象超出其作用域时,存放tmp对象的内存地址被销毁。在C++中,变量的生命周期由其作用域确定。在这段代码中,tmp
对象是在substr
函数内部创建的局部变量。
当程序执行到函数的结尾时,tmp
对象所占用的内存将会被释放,该对象将被销毁。这是因为tmp
是一个自动变量,它的生命周期限定在函数的作用域内。
在这种情况下,由于函数返回了tmp
的副本给调用者,即使tmp
对象被销毁,调用者仍然可以使用函数返回的字符串副本。但需要注意的是,这并不意味着tmp
对象在超出作用域后仍然存在,而只是已经复制的副本可供调用者使用。
所以此时我们需要自己写一个string的深拷贝构造函数
深拷贝是指创建一个新对象,并将源对象的所有数据成员复制到新对象中,包括基本类型数据和指针所指向的内存内容。因此,在深拷贝中,新对象会拥有自己的内存空间,与源对象完全隔离,修改其中一个对象不会影响另一个对象。当对象包含指针时,深拷贝将会为目标对象分配新内存,并将源对象指针指向的内容复制到新内存中,从而避免了指针共享所带来的问题。