求助, 关于析构函数, 构造函数的.

xlxlxl1985 2010-09-16 03:00:21
#include "stdafx.h"
#include <cstring>
#include <iostream>
#include "Strings.h"

int Strings::num_strings = 0;

Strings::Strings()
{
length = 1;
str = new char[length];
str[0] = '\0';
}

Strings::Strings(const Strings &st)
{
length = st.length;
str = new char[length]; // waiting for confirmation of the end notation.
std::strcpy(str, st.str);
num_strings ++;
}

Strings::Strings(const char *s)
{
length = std::strlen(s);
str = new char[length];
std::strcpy(str, s);
num_strings ++;
}

Strings::~Strings()
{
delete [] str;
num_strings --;
}

Strings Strings::operator+(const Strings &st)
{
return std::strcat(str, st.str);
}


这是小弟写的, 为什么在调用的时候删除总是抱错呢?
num_strings总是多一个

Strings st1 = "11111111111";
Strings st2("2222222222");
Strings st3 = Strings("3333333333");

如果这样, num_strings就是4了.
请问是问什么呀, 我正在自学c++, 看到复制构造函数, 赋值运算符这里, 怎么做也做不对, 感觉还是没理解呀~
树上说, 默认的构造函数和默认的赋值运算符都会值复制对象, 可以通过定义默认构造函数的方法解决, 我在上面的代码中已经按照书上的方法做了, 为什么还是没有解决?
谢谢各位了, 分不多, 还望各位不吝赐教
...全文
72 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlxlxl1985 2010-09-16
  • 打赏
  • 举报
回复
我完全明白我错在哪里了, 实在太感谢各位了! 小弟分不多, 各位朋友将就下吧, 再次谢谢各位了
we_sky2008 2010-09-16
  • 打赏
  • 举报
回复
operator+也有问题,可以改为下面:

Strings Strings::operator+(const Strings &st)
{
char *p = new char [length + strlen(st.str) + 1];

strcpy(p, str);
strcpy(p + length, st.str);

return p;
}

gules 2010-09-16
  • 打赏
  • 举报
回复
length+1的问题还只是小总是,你的问题主要在于维护计数上,也就是说编写复制构造函数时要特别注意:一不小心临时变量就是搞乱你的计数器。另外,operator=也一定要写(与copy ctor对应)

Strings::Strings(const Strings &st)
{
*this = st; //调用赋值操作符
}

Strings& Strings::operator=(const Strings& st)
{
if (this != &st) {
--num_strings;
delete[] str; // 先释放自己原有数据

// 再复制新数据
length = st.length;
str = new char[length + 1];
std::strcpy(str, st.str);
++num_strings;
}
return *this;
}
we_sky2008 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xlxlxl1985 的回复:]
我照各位说的把长度+了1, 解决了, 这是什么意思?
各位可以告诉我下理由吗?
可以稍微详细一点吗?
小弟先谢谢各位了
[/Quote]
strlen计算的和实际要占用的差1
因为strlen没有计算最后的结束符'\0'
xlxlxl1985 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 freezezdj 的回复:]
Strings st3 = Strings("3333333333");
分解动作:
Strings("3333333333");
相当于
Strings temp("3333333333"); // 一次。

Strings st3 = Strings("3333333333");
相当于
Strings st3 = temp; // 两次,在这儿会调用一次拷贝构造,而不是op……
[/Quote]

但是这个中间变量"temp"当这条语句完成就会被删除吧?
xlxlxl1985 2010-09-16
  • 打赏
  • 举报
回复
我照各位说的把长度+了1, 解决了, 这是什么意思?
各位可以告诉我下理由吗?
可以稍微详细一点吗?
小弟先谢谢各位了
we_sky2008 2010-09-16
  • 打赏
  • 举报
回复
new char[length];全部改为new char[length + 1];
冻结 2010-09-16
  • 打赏
  • 举报
回复
Strings st3 = Strings("3333333333");
分解动作:
Strings("3333333333");
相当于
Strings temp("3333333333"); // 一次。

Strings st3 = Strings("3333333333");
相当于
Strings st3 = temp; // 两次,在这儿会调用一次拷贝构造,而不是operator=();
we_sky2008 2010-09-16
  • 打赏
  • 举报
回复
数组越界了
we_sky2008 2010-09-16
  • 打赏
  • 举报
回复
试试length + 1

Strings::Strings(const Strings &st)
{
length = st.length;
str = new char[length + 1]; // waiting for confirmation of the end notation.
std::strcpy(str, st.str);
num_strings ++;
}

Strings::Strings(const char *s)
{
length = std::strlen(s);
str = new char[length + 1];
std::strcpy(str, s);
num_strings ++;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧