如果有人问过这个我道歉,但是如何在c ++中创建一个成员函数,它返回以下scenerios中的指针:1.返回的指针是常量,但可以修改里面的垃圾.2.里面的垃圾是常量但可以修改返回的指针.3.垃圾和指针都不能被修改.
是这样的:
int *const func() constconst int* func() constconst 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)
int *const func() const
const除少数情况外,您无法观察到此处
func.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
这只是前两个的组合:)