C++ 定制C++;字符串类
我正在创建一个类似于string类的类。我在做一些实验的开始阶段 假设添加了所有头文件C++ 定制C++;字符串类,c++,C++,我正在创建一个类似于string类的类。我在做一些实验的开始阶段 假设添加了所有头文件 class String { public: int len; char *str = NULL; // Default constructor String() {
class String
{
public:
int len;
char *str = NULL;
// Default constructor
String()
{
len = 0;
str = new char[1];
str[0] = '\0';
printf("New memory: %p\n", str);
}
// Copy constructor
String(const char *ch)
{
len = strlen(ch);
if (str != NULL)
{
printf("Old memory: %p\n", str);
delete str;
printf("Deleted...\n");
}
str = new char[len + 1];
printf("New memory: %p\n", str);
for (int i = 0; i <= len; i++)
str[i] = ch[i];
}
};
int main()
{
String msg;
std::cout << msg.len << std::endl;
std::cout << msg.str << std::endl;
msg = "Hello";
std::cout << msg.len << std::endl;
std::cout << msg.str << std::endl;
}
类字符串
{
公众:
内伦;
char*str=NULL;
//默认构造函数
字符串()
{
len=0;
str=新字符[1];
str[0]='\0';
printf(“新内存:%p\n”,str);
}
//复制构造函数
字符串(常量字符*ch)
{
len=strlen(ch);
如果(str!=NULL)
{
printf(“旧内存:%p\n”,str);
删除str;
printf(“已删除…\n”);
}
str=新字符[len+1];
printf(“新内存:%p\n”,str);
对于(int i=0;i您的代码执行以下操作:
- 默认构造一个
字符串
“a”
- 从表达式
“Hello”
- 复制将“B”分配给“A”
赋值不会调用“A”上的构造函数。每个对象只能得到一个构造
除非您另外指定(使用委托构造函数),否则在运行“复制构造函数”(或类似于您的转换构造函数)之前不会调用默认构造函数
因此:
它应该执行,因为str在默认构造函数的前面分配了一个字节的内存,并且它不是空的
这是错误的
字符串(const char*ch)
需要分配
另外,由于您正在执行分配,因此需要实现一个复制分配操作符以确保安全。您的代码执行以下操作:
- 默认构造一个
字符串
“a”
- 从表达式
“Hello”
- 复制将“B”分配给“A”
赋值不会调用“A”上的构造函数。每个对象只能得到一个构造
除非您另外指定(使用委托构造函数),否则在运行“复制构造函数”(或类似于您的转换构造函数)之前不会调用默认构造函数
因此:
它应该执行,因为str在默认构造函数的前面分配了一个字节的内存,并且它不是空的
这是错误的
字符串(const char*ch)
需要分配
也因为执行赋值,所以需要实现一个拷贝赋值操作符来确保它的安全性。< /P>这不是一个复制构造函数。这是一个构造函数,它使用了<代码> const char */COD>。复制构造函数将有签名<代码>字符串(const string and and)()/c> >不是C++(包括它的各种库)已经有足够多的字符串类了?为什么还要创建另一个呢?当您为一个类调用非默认构造函数时,默认构造函数不会事先调用。当您输入string(const char*)
时,您的string
处于与刚输入string()相同的状态
。这意味着str==NULL
。也可以使用nullptr
。@JohnFilleau我们有答案部分。谢谢。@JesperJuhl学习?实践?这是一个非常常见的练习,不是吗?那不是复制构造函数。那是一个接受const char*
的构造函数。复制构造函数会有签名E<代码>字符串(const string and and)(/CONTRORY)< /C> > C++(包括它的各种库)已经有足够多的字符串类了吗?为什么创建另一个类?当调用类的非默认构造函数时,默认构造函数不会预先调用。
您的字符串
处于与您刚刚输入的字符串()相同的状态
。这意味着str==NULL
。也可以使用nullptr
来代替。@JohnFilleau我们有一个答案部分。谢谢。@JesperJuhl学习?练习?这是一个非常常见的练习,不是吗?啊,现在我知道你的误解在哪里了。啊,现在我知道你的误解在哪里了。