struct A
{
void foo() const
{
std::cout << "const" << std::endl;
}
private:
void foo()
{
std::cout << "non - const" << std::endl;
}
};
int main()
{
A a;
a.foo();
}
换句话说,为什么重载解决先于访问控制?这很奇怪。你认为是一致的吗?我的代码工作了,然后我添加了一个方法,我的工作代码根本不编译。
当您调用a.foo();
时,编译器将通过重载解析来找到要使用的最佳函数。当它构建重载集时
void foo() const
和
void foo()
现在,由于不是
const
,所以非const版本是最佳匹配,因此编译器选择void foo()
。然后访问限制就到位了,您会得到一个编译器错误,因为void foo()
是私有的。
请记住,在过载解决方案中,它不是“找到最佳可用函数”。它是‘找到最好的功能并尝试使用它’。如果由于访问限制或被删除而不能,则会出现编译器错误。
换句话说,为什么重载解决先于访问控制?
好吧,让我们来看看:
struct Base
{
void foo() { std::cout << "Base\n"; }
};
struct Derived : Base
{
void foo() { std::cout << "Derived\n"; }
};
struct Foo
{
void foo(Base * b) { b->foo(); }
private:
void foo(Derived * d) { d->foo(); }
};
int main()
{
Derived d;
Foo f;
f.foo(&d);
}
调用常量方法 常量方法是在智能合约中读取值的方法,而不改变智能合约的状态。这些方法与它们生成的智能合约相同的方法签名都是可用的: Type result = contract.someMethod(<param1>, ...).send();
问题内容: 我很好奇,为什么是方法的公开? 此方法从调用它的位置替换原始堆栈跟踪,从而删除了定位异常所需的信息。它可以用于混淆,但无需付出太多努力,因为新的堆栈跟踪将直接指向混淆代码。更好的方法是简单地隐藏异常或抛出新异常。 但是我找不到在现存的上调用此方法的 合理 理由。所以问题是:为什么这种方法是公开的?后面有什么意义吗? 问题答案: 原因之一是性能。抛出和捕获异常很便宜;昂贵的部分是填充堆栈
问题内容: 我看过这样的例子: 并假设我可以有一个Constants类来包装常量,并声明它们为static final。我几乎不了解Java,并且想知道这是否是创建常量的最佳方法。 问题答案: 这是完全可以接受的,甚至可能是标准。 类型是哪里,是所有大写字母的名称,下划线带有空格,并且VALUE是常量值; 我强烈建议不要将常量放在自己的类或接口中。 附带说明:声明为final且可变的变量仍然可以更
问题内容: 我当时正在上课,我想到了几个问题。 我注意到,其他类将使用的公共方法调用了一些私有方法来完成所有工作。现在,我知道OOD的原则之一就是尽可能多地私有化并隐藏所有实现细节。我不确定我是否完全理解其背后的逻辑。 我知道将字段设为私有很重要,以防止将无效值存储在字段中(这只是许多原因之一)。但是,对于私有方法,我不确定为什么它们如此重要。 例如,对于类,我们是否不能将所有实现代码都放入公共方
我们举个例子: 一个常见的解决方案是转移到一个抽象类,但是在我的具体案例中,我有一个枚举的接口,所以在这里不适用。我想这不是被忽略了,就是因为接口背后的原始想法,即它们是可用方法的“契约”,但我想我需要关于这是怎么回事的输入。 我读过“为什么Java 8接口方法中不允许使用”final“?”,其中说: 默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现 与关联问题一样,由
什么是运行时常量池和java中的方法区。我读到JVM创造了这两个,但是哪一个是第一个存在的?还有它们包含什么?任何帮助将不胜感激。