c ++ const成员函数,它返回一个const指针..但返回的指针是什么类型的const?

Jor*_*Jor 37 c++ const

如果有人问过这个我道歉,但是如何在c ++中创建一个成员函数,它返回以下scenerios中的指针:1.返回的指针是常量,但可以修改里面的垃圾.2.里面的垃圾是常量但可以修改返回的指针.3.垃圾和指针都不能被修改.

是这样的:

  1. int *const func() const
  2. const int* func() const
  3. const int * const func() const

我读过的所有教程都没有涵盖这一区别.

旁注:如果我的方法被声明为const,那么教程说我说我不会修改参数..但是在参数是指针的情况下,这对我来说还不够清楚.我的参数需要像:

一个.void func(const int* const x) const;
void func(const int* x) const;
C.void func(const int* const x) const;

Arm*_*yan 70

我不知道你读了什么书,但是如果你标记一个方法const意味着this它将是类型const MyClass*而不是MyClass*,这反过来意味着你不能改变未声明的非静态数据成员mutable,也不能调用任何非const方法this.

现在为返回值.

1. int * const func () const

函数是常量,返回的指针是常量,但可以修改'junk inside'.但是,我认为返回一个const指针是没有意义的,因为最终的函数调用将是一个rvalue,并且非类型的rvalues不能const,这意味着const无论如何都会被忽略

2. const int* func () const

这是一件有用的事情."垃圾内部"无法修改

3. const int * const func() const

由于1中的原因,语义几乎与2相同.

HTH


Pat*_*ick 15

const的一些用法并没有多大意义.

假设您具有以下功能:

void myFunction (const int value);
Run Code Online (Sandbox Code Playgroud)

const告诉编译器,函数内部的值不能改变.此信息对调用者没有任何价值.由函数本身决定如何处理该值.对于调用者,以下两个函数定义对他来说完全相同:

void myFunction (const int value);
void myFunction (int value);
Run Code Online (Sandbox Code Playgroud)

因为值是通过值传递的,这意味着函数无论如何都会获得本地副本.

另一方面,如果参数是引用或指针,事情就会变得非常不同.

void myFunction (const MyClass &value);
Run Code Online (Sandbox Code Playgroud)

这告诉调用者值是通过引用传递的(所以在屏幕后面它实际上是一个指针),但调用者承诺不会改变值.指针也是如此:

void myFunction (const MyClass *value);
Run Code Online (Sandbox Code Playgroud)

我们传递一个指向MyClass的指针(由于性能原因),但该函数承诺不会更改该值.

如果我们写下以下内容:

void myFunction (MyClass * const value);
Run Code Online (Sandbox Code Playgroud)

然后我们回到第一个情况.myFunction获取一个指针,该指针由值传递,并且是const.由于MyFunction获取指针值的副本,因此调用者是否为const并不重要.最重要的是myFunction可以更改value的内容,因为指针变量本身是const,但其中的内容不是.

返回值也是如此:

const double squareRoot(double d);
Run Code Online (Sandbox Code Playgroud)

这没有任何意义.squareRoot返回一个const double,但由于它是'by value'传递的,因此需要复制到我自己的局部变量,我可以随心所欲地做它.

另一方面:

const Customer *getCustomer(char *name);
Run Code Online (Sandbox Code Playgroud)

告诉我getCustomer向我返回一个指向客户的指针,我不允许更改客户的内容.

实际上,最好还要生成char-pointer-contents const,因为我不希望函数改变给定的字符串:

const Customer *getCustomer(const char *name);
Run Code Online (Sandbox Code Playgroud)


Joh*_*itb 6

int *const func() const

const除少数情况外,您无法观察到此处

  • 以地址为例func.
  • 在C++ 0x中,func使用函数调用语法作为decltype操作数直接调用将产生int * const.

这是因为您返回一个纯指针值,也就是说指针值实际上并未存储在指针变量中.这些值不是const限定的,因为它们无论如何都不能改变.obj.func() = NULL;即使你拿走了,你也不能说const.在这两种情况下,表达式obj.func()都具有类型int*且不可修改(有人会很快引用标准并提出术语"rvalue").

因此,在上下文中,您使用返回值,您将无法找到差异.如果您参考声明或整个功能本身,您会注意到差异.

const int* func() const

这就是你通常会做的事情,如果身体会是这样的return &this->intmember;.它不允许通过执行来更改int成员*obj.func() = 42;.

const int * const func() const

这只是前两个的组合:)