编辑:谢谢大家。有很多很棒的信息可供查阅。我会花一点时间来吸收。
经过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()
中?)为什么不通过副本传递?或使用运营商的地址?
我问的是“错误的问题”吗?没看清楚的东西?
非常感谢。希望问题很清楚。
它不是。
字符串文字只是内存中某处的字符序列。它们没有被某些物体包裹。
像MyString
或std::string
这样的对象可以充当包装器对象,并且可以复制它们或更改它们。
但字符串文字只是记忆。以'\0'
结尾的字符序列。它们无法改变,因此访问它们的方式是const char*
。
这是通过poiter
传递一个字符串文字,这是一个神仙般的快速。您可以接受具有显式构造函数的std::string
,并将从字符串文字中创建std::string
字符串对象。
另一方面,通过引用(&)传递是完全不同的概念。就像传递物体一样。没有副本,没有指针(可能由编译器使用指针完成,但你不应该考虑这一点)。
为什么MyString希望从第一个参数(在main()中)创建一个指针?)
因为数组在最轻微的挑衅中转换为指针,而""
文字是const char
数组。
为什么不通过副本?
因为您无法分配或复制C风格的数组。
或使用运营商的地址?
从const char[23]
到const char *
有一个隐含的转换。
在旁边:
在c ++中,空指针拼写为nullptr
,你可以安全地使用delete[]
,并且为MyString
生成一个隐式复制构造函数和复制赋值运算符,这将导致delete[]
的双buffer
s