这可能会导致无限循环
Might this cause an infinite loop?
本文关键字:无限循环 更新时间:2023-10-16
对于定义函数的第二个const
版本,这样做是否保证安全?看起来它会有无限递归,因为我想返回const
但我想要调用的另一个函数是 non-const。
它适用于 g++,但我担心这是不安全的。
#include <iostream>
using namespace std;
class test {
public:
int* doSomething(int a) {
int* someInt = new int(a);
return someInt;
}
const int* doSomething(int a) const {
return doSomething(a);
}
};
int main() {
test a;
cout << *a.doSomething(12345) << endl;
return 1;
}
不完全是:正如@Pete Becker在评论中指出的那样,如果您调用了将递归的const
版本:
class test {
public:
int* doSomething(int a) {
int* someInt = new int;
*someInt = a;
return someInt;
}
const int* doSomething(int a) const {
return doSomething(a);
}
};
int main() {
const test a;
// You're not in for a good time:
a.doSomething(12345);
return 1;
}
在提供需要重复代码的函数的const
和非const
版本时,最好实现const
版本,然后让非const
版本以特定方式调用它。
来自斯科特迈尔斯有效C++ - 第三版:
当
const
和非const
成员函数具有基本相同的实现时,可以通过让非const
版本调用const
版本来避免代码重复
斯科特·迈尔斯(Scott Myers)继续为此提供了一种安全的方法:
const int* doSomething(int a) const
{
int* someInt = new int;
*someInt = a;
return someInt;
}
int* doSomething(int a)
{
return const_cast<int*>(static_cast<const Test&>(*this).doSomething());
}
在非const
版本中,有两种演员阵容:static_cast
基本上将this
变成const this
,其中const_cast
抛弃了回归的const
性。这样做是安全的,因为要调用非const
版本,您必须具有非const this
。
但是,如果您只是提供对成员的访问权限,则只需具有以下内容即可简单易读:
class TestAccess;
class Test
{
TestAccess& t;
public:
const TestAccess& getA() const { return t; }
TestAcess& getA() { return t; }
};
在这种情况下,编译器总是会选择函数的非常量版本,甚至不会调用常量版本。否则编译器将无法编译,您正在制动 constenss。例如,我快速修改了代码:
#include <iostream>
using namespace std;
class test {
public:
int* doSomething(int a) {
int* someInt = new int;
*someInt = a;
return someInt;
}
int ax = 10;
void somethingElse(int i)
{
ax = i;
}
const int* doSomething(int a) const {
somethingElse(a);
return 0;
}
};
int main() {
test a;
cout << *a.doSomething(12345) << endl;
return 1;
}
此示例无法编译,因为您正在 const 作用域内调用 const 函数。编译器不会让你这样做。
现在,我知道这是一个测试,但这样做你永远不会摆脱递归,它会永远循环,而且你在每次调用时都会通过分配堆来泄漏内存,这两件事一起会导致灾难。
相关文章:
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 连接线程时的无限循环
- 为什么这种方法会进入无限循环?
- 由于QTextStream的无限循环
- Qt 在另一个线程中无限循环
- 从文件 C++ 读取时的无限循环
- 试图找出为什么我的代码保持无限循环