当一个函数/方法应该要求*或&

问题描述 投票:-1回答:2

编辑:谢谢大家。有很多很棒的信息可供查阅。我会花一点时间来吸收。

经过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++ pointers member-function-pointers
2个回答
1
投票

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

这是通过poiter传递一个字符串文字,这是一个神仙般的快速。您可以接受具有显式构造函数的std::string,并将从字符串文字中创建std::string字符串对象。

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


1
投票

为什么MyString希望从第一个参数(在main()中)创建一个指针?)

因为数组在最轻微的挑衅中转换为指针,而""文字是const char数组。

为什么不通过副本?

因为您无法分配或复制C风格的数组。

或使用运营商的地址?

const char[23]const char *有一个隐含的转换。

在旁边:

在c ++中,空指针拼写为nullptr,你可以安全地使用delete[],并且为MyString生成一个隐式复制构造函数和复制赋值运算符,这将导致delete[]的双buffers

© www.soinside.com 2019 - 2024. All rights reserved.