C++:getter 如何返回指向动态分配数组的指针,而不直接访问它

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

本文关键字:指针 数组 访问 动态分配 何返回 getter 返回 C++      更新时间:2023-10-16

所以问题是:

如果我有一个程序,例如:

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;
}

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

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

如果我们有一个静态字段,例如:静态无符号 int* arrayI;以及一个像从 arrayI 返回值的 getter 一样工作的静态方法会怎样?

我认为

你在要求 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

作为旁注:
不要自己管理内存分配。指针代替原始char*指针使用 std::string .

您可以分配一个新的 char*,然后返回该地址,以便在用户更改他们收到的内容时,它不会更改类中的私有字段。