首页 > 解决方案 > 当一个函数/方法需要 * 或 &

问题描述

编辑:谢谢大家。很多很棒的信息要过去。需要我一段时间来吸收。

经过 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()?)中创建一个指针,为什么它不只是通过副本传递?还是使用运营商的地址?

我在问“错误的问题”吗?看不清楚什么?

非常感谢。希望问题很清楚。

标签: c++pointersmember-function-pointers

解决方案


它不是。
字符串文字只是内存中某处的一系列字符。它们没有被某个物体包裹。
MyStringstd::string可能充当包装器对象的对象并具有复制或更改它们的方法。
但是字符串文字只是记忆。以 结尾的字符序列'\0'。它们无法更改,因此访问它们的方式是const char*.

这是传递一个字符串文字,poiter速度很快。您可以接受std::string它具有显式构造函数并将std::string从字符串文字创建一个字符串对象。

另一方面,通过引用(&)传递是完全不同的概念。这就像传递对象。没有副本,没有指针(编译器可能用指针完成,但你不应该考虑这个)。


推荐阅读