C++:getter return 如何在不直接访问它的情况下指向动态分配的数组?

C++: How does a getter return a pointer to a dynamically allocated array without giving direct acces to it?

所以问题是:

如果我有这样的程序:

class Ticket
{
 private: 
    char* concertName;
 public:
    Ticket(char* name="Concert");
    char* getConcertName();
}
int main()
{
   char* test;
   Ticket t1;
   test=t1.getConcertName();
   test[1]='A';     
}
Ticket::Ticket(char* name)
{
   this->concertName=new char[strlen(Concert)+1];
   strcpy(this->concertName,name);
}
Ticket::getConcertName()
{
  return this->concertName;
}

getter return 会是什么?我的直觉告诉我,它 return 是指向我之前为 concertName 分配的内存块的第一个元素的指针,因此我可以在不使用 setter 的情况下直接从 main 更改数组的值,就像我一样在示例中做了。

它可以改变它,但是如果不使用 setter 或 getter,私有区域的想法是限制从对象外部访问它的属性。

如果我们有一个静态字段会怎样:static unsigned int* arrayI;和一个像 getter return 从 arrayI?

中获取值的静态方法

您可以分配一个新的 char*,然后 return 该地址,这样即使用户更改了他们收到的内容,也不会更改您 class 中的私有字段。

我想你要求的是常量:

将 const 添加到您的 getter 将阻止调用者修改指针。

#include <cstdio>
class Ticket
{
 private:
    char concertName[sizeof("Concert")];
 public:
    Ticket(const char *name = "Concert");
    const char* getConcertName() const;
};

int main()
{
   const char *test;
   Ticket t1;
   test = t1.getConcertName(); //OK with const
   //test[1]='A'; // would not compile
}
Ticket::Ticket(const char *name)
{
   snprintf(concertName, sizeof(concertName), "%s", name);
}
const char *Ticket::getConcertName() const
{
  return concertName;
}

防止更改指针引用内存的常用方法是使用const关键字:

const char* getConcertName() const;

成员函数后面的const表示它也可以和对Ticket.

的常量引用一起使用

使用此声明,客户端被迫使用 const char* 来接收 getter 的结果:

const char* test;
Ticket t1;
test=t1.getConcertName();

并且尝试更改该值将导致相应的编译器错误消息:

test[1]='A'; // <<<<<<<<<<<<<<<<< Compiler error

旁注:
不要自己管理内存分配。使用 std::string.

而不是原始 char* 指针