- 论坛徽章:
- 0
|
昨天的一段代码, 思考一下又回来了, 大家看看对不对...
- string str = "abcdeeeee"; // step1
- // 这里应该是调用的是一个带一个参数的构造函数, 不是什么operator=,
- //string类对象都没有构造, 哪里能调用类方法???
复制代码
这个应该是operator=,构造函数的形式是classname valname(parameter list);
string的构造函数有很多,可以参看basic_string.h中的内容,对模版类不熟,我说不来
- char* c = (char*)str.c_str(); // step2
- // str.c_str() 函数返回的是一个const char*的指针, 它应该是指向str对象的
- 一个公有变量(见step4), char*类型的指针, 该变量所指向的内存空间分配
- 在堆里
复制代码
c这是应该指向str的私有变量 _M_dataplus._M_p所指的地址。
//_CharT* _M_p; // The actual data..也就是指向str实际数据的内存处
详细请查看basic_string.h,我也是先炒现卖的…
- str.append(10, '!'); // setp3
- // str追加10个!号
复制代码
这里str的append函数会发现原来分配的内存空间不够了,会重新分配的,所以内存地址变了
可以用printf("address of c:%x ,str:%x ",c,str.c_str());看看
- cout << "str: " << str << endl;
- // str: abcdeeeee!!!!!!!!!!
- cout << "c: " << c << endl;
- // c的值不变, 故可见c指向的是与str不同的一片内存空间
- // 又str的值在栈中, 不可能相同
复制代码
这时他们的内存是不一样了,这时c指向的应该是被free或者delete的了……如果还用c操作这片内存是很危险的。如果中间有其他的动态分配内存的动作,很可能就修改了原来的内容。
- c = "abc"; // step4
- cout << "c: " << c << endl;
- // c: abc
- // c的值可更改, 故c_str()函数返回的是对象str的一个公有变量v
复制代码
c="abc";是重新把一个常量字符串的首地址赋给了c,而不是改变c原来指向的内存。要使用c指向的内存要使用*接指针或者用[]下标。要清楚指针和指针指向的内容。 |
|