首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

STL中的string的substr有关问题

2012-03-15 
STL中的string的substr问题不知道大家有没有想过这样的问题C/C++ codechar *buf abcdefgstring s1(bu

STL中的string的substr问题
不知道大家有没有想过这样的问题

C/C++ code
char *buf = "abcdefg";string s1(buf);string s2 = s1.substr(0,3);


substr成员函数先要构造一个只包含字符 abc 的一个string的对象,那么s2只是引用了这个对象还是重新构造一个对象,把substr的返回值拷贝到自己的对象里?

[解决办法]
那么s2只是引用了这个对象还是重新构造一个对象
---
重新构造一个
[解决办法]
string s2 = s1.substr(0,3); //这样调用 operator = 拷贝构造了!
[解决办法]
string s2 = s1.substr(0,3);
s2调用拷贝构造函数了,肯定是构造了个新对象
还有
C/C++ code
basic_string substr(   size_type _Off = 0,   size_type _Count = npos) const;
[解决办法]
拷贝构造了一个
[解决办法]
S2应该是重新构造了,然后substr返回的那个再通过拷贝构造函数过来
[解决办法]
重新构造一个

[解决办法]
引用楼主 sunnyplain 的帖子:
不知道大家有没有想过这样的问题

C/C++ code
char *buf = "abcdefg";
string s1(buf);
string s2 = s1.substr(0,3);




substr成员函数先要构造一个只包含字符 abc 的一个string的对象,那么s2只是引用了这个对象还是重新构造一个对象,把substr的返回值拷贝到自己的对象里?

[解决办法]
string s2 = s1.substr(0,3);//
隐式调用拷贝构造函数,string s2后接=实现为一步 调用拷贝构造函数

[解决办法]
C/C++ code
# include <iostream>using namespace std;class C{public:        C(int i):n(i){cout << "Construct C" << i << endl;}        C(const C& c){n = c.n; cout << "Construct _C" << c.n << endl;}        ~C(){cout << "Destruct C" << n << endl;}        C& operator= (const C& c){cout << "Copy from C" << c.n << " to " << "C" << n << endl; /*n = c.n;*/}//没有变n的值private:        int n;};C f(int i){        C c(i);        return c;}int main(){        C c0 = f(0);        c0 = f(1);system("PAUSE");        return 0;}
[解决办法]
探讨
测试一下不就行了:更改s2,再看看s1变不变。

[解决办法]
这里会隐式调用拷贝构造函数。

拷贝构造函数的语义和赋值构造函数的语义是不一样的。
前者是用一个对象初始化一个尚未被初始化的对象
而赋值构造函数的语义是,用一个对象,去赋值另外一个已经存在的对象。

比如说:
string s1 = "hello";
string s2 = s1; // 拷贝构造函数被调用
string s3 = "world";
s3 = s1; //赋值构造函数被调用。



[解决办法]
返回的不是引用,所以是重新构造了个对象

热点排行