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*
指针
所以问题是:
如果我有这样的程序:
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*
指针