编辑:谢谢。有很多很棒的信息要去。请花点时间来吸收。
在经历了10多年的不健康的编程浪漫之后,我认为我终于明白了指针。但是我对他们仍然不满意。
我有一些相对简单的代码:
#include <iostream>
#include <string.h>
using namespace std;
class MyString
{
private:
char* buffer;
public:
//Constructor
MyString(const char* initString)
{
if(initString != NULL)
{
buffer = new char[strlen(initString)+1];
strcpy(buffer, initString);
}
else
buffer = NULL;
}
//Destructor
~MyString()
{
cout << "Invoking destructor, clearing up\n";
if (buffer != NULL)
delete [] buffer;
}
int GetLength()
{
return strlen(buffer);
}
const char* GetString()
{
return buffer;
}
};
int main()
{
MyString SayHello("Hello from String Class");
cout << "String buffer in MyString is " << SayHello.GetLength();
cout << " characters long\n";
cout << "Buffer contains: " << SayHello.GetString() << endl;
return 0;
}
为什么MyString
希望从第一个参数(在main()
中创建指针)?为什么它不只是通过复制传递?或使用操作员的地址?
我要问“错误的问题”吗?看不清楚吗?
非常感谢。希望问题清楚。
答案 0 :(得分:1)
没有。
字符串文字只是存储器中某处的字符序列。它们没有被某些物体包裹。
像MyString
或std::string
这样的对象可以充当包装器对象,并可以复制或更改它们。
但是字符串文字只是内存。以'\0'
结尾的字符序列。它们无法更改,因此访问它们的方式是const char*
。
这将通过poiter
传递字符串字面量,速度很快。
您可以接受具有显式构造函数的std::string
,并将根据字符串文字创建一个std::string
字符串对象。
另一方面,通过引用(&)传递则是完全不同的概念。 就像传递对象一样。没有副本,没有指针(编译器可以使用指针来完成,但您不应该考虑这一点)。
答案 1 :(得分:1)
为什么MyString希望从第一个参数(在main()中)创建一个指针?
因为数组在丝毫挑衅下都会转换为指针,并且""
文字是const char
数组。
为什么它不只是通过复印?
因为您无法分配或复制C样式的数组。
还是使用操作员的地址?
从const char[23]
到const char *
的隐式转换。
在旁边:
在c ++中,空指针的拼写为nullptr
,可以安全地delete[]
编写,并且为MyString
生成了一个隐式副本构造函数和副本赋值运算符,这将导致delete[]
中的两个buffer