函数/方法何时要求*或&

时间:2019-04-08 15:11:37

标签: c++ pointers member-function-pointers

编辑:谢谢。有很多很棒的信息要去。请花点时间来吸收。

在经历了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()中创建指针)?为什么它不只是通过复制传递?或使用操作员的地址?

我要问“错误的问题”吗?看不清楚吗?

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

2 个答案:

答案 0 :(得分:1)

没有。
字符串文字只是存储器中某处的字符序列。它们没有被某些物体包裹。
MyStringstd::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