有没有办法在Python中声明一个常量?在Java中,我们可以用这种方式创建常量值:
public static final String CONST_NAME = "Name";
Run Code Online (Sandbox Code Playgroud)
Python中上述Java常量声明的等价物是什么?
我已经阅读了几篇关于不变性的文章,但仍然没有很好地遵循这个概念.
我最近在这里提到了一个线程,提到了不变性,但由于这本身就是一个话题,我现在正在制作一个专门的线程.
我在过去的帖子中提到过,我认为不变性是将对象设为只读并使其可见性低的过程.另一位成员表示,这与此没有任何关系.此页面(系列的一部分)使用不可变类/结构的示例,它使用readonly和其他概念将其锁定.
在这个例子中,状态的定义究竟是什么?国家是一个我没有真正掌握的概念.
从设计指南的角度来看,一个不可变的类必须是一个不接受用户输入并且真的只返回值的类?
我的理解是,任何只返回信息的对象都应该是不可变的并且"锁定",对吧?因此,如果我想在具有该方法的专用类中返回当前时间,我应该使用引用类型,因为它将工作类型的引用,因此我受益于不变性.
可能重复:
卖给我关于const的正确性
关键字的用处是什么const,C或者C++因为它允许这样的事情?
void const_is_a_lie(const int* n)
{
*((int*) n) = 0;
}
int main()
{
int n = 1;
const_is_a_lie(&n);
printf("%d", n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:0
很明显,const不能保证论证的不可修改性.
我最近与另一位C++开发人员就以下用途进行了交流const:
void Foo(const int bar);
Run Code Online (Sandbox Code Playgroud)
他认为const以这种方式使用是很好的做法.
我认为它对函数的调用者没有任何作用(因为参数的副本将被传递,因此对于覆盖没有额外的安全保证).此外,这样做可以防止实现者Foo修改其参数的私有副本.因此,它既要求又要宣传实施细节.
不是世界末日,但肯定不是值得推荐的良好做法.
我很好奇别人对这个问题的看法.
好吧,我没有意识到参数的常数没有考虑到函数的签名.因此,可以const在实现(.cpp)中标记参数,而不是在标题(.h)中标记- 并且编译器就可以了.既然如此,我想政策应该与制作局部变量const相同.
人们可以提出这样的论点:在标题和源文件中具有不同的看起来签名会使其他人感到困惑(因为它会使我感到困惑).虽然我试着用我写的任何内容来遵循最小惊讶原则,但我认为期望开发人员认为这是合法且有用的是合理的.
我试图了解我应该如何const在C代码中使用.首先,我并没有真正使用它,但后来我看到了很多const在整个过程中使用的例子.我应该努力并回去并虔诚地制作合适的变量const吗?或者我只是在等我的时间?
我想它可以更容易地读取预期会发生变化的变量,特别是在函数调用中,对于人类和编译器.我错过了其他重要的观点吗?
大约六年前,一位名叫Harri Porten的软件工程师写了这篇文章,问了一个问题,"成员函数什么时候应该有const限定符?什么时候不应该?" 我发现这是我能找到的关于这个问题的最好的写作,我最近一直在努力解决这个问题,而且我认为在大多数关于const正确性的讨论中,这个问题都没有得到很好的解释.由于当时不存在像SO这样强大的软件信息共享站点,我想在这里重新提出这个问题.
我试图通过遍历枚举创建一副扑克牌Suit和Rank(我知道有没有遍历枚举好办法,但我没有看到另一种).我通过enum_count在每个枚举的末尾添加一个枚举器来做到这一点,其值用于表示枚举的长度和结尾.
#include <vector>
using namespace std;
enum class Suit: int {clubs, diamonds, hearts, spades, enum_count};
enum class Rank: int {one, two, three, four, five, six, seven, eight,
nine, ten, jack, queen, king, ace, enum_count};
struct Card {
Suit suit;
Rank rank;
};
class Deck{
vector<Card> cards{};
public:
Deck();
};
Deck::Deck() {
// ERROR ON THE BELOW LINE
for (Suit suit = Suit::clubs; suit < Suit::enum_count; suit++) {
for (Rank rank = Rank::one; rank < …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种使用NumericMatrix和NumericVector类计算矩阵乘法的方法。我想知道是否有任何简单的方法可以帮助我避免以下循环进行此计算。我只想计算X%*%beta。
// assume X and beta are initialized and X is of dimension (nsites, p),
// beta is a NumericVector with p elements.
for(int j = 0; j < nsites; j++)
{
temp = 0;
for(int l = 0; l < p; l++) temp = temp + X(j,l) * beta[l];
}
Run Code Online (Sandbox Code Playgroud)
提前非常感谢您!
我将一个对象的引用传递给一个函数,我使用const来表示它是只读方法,但如果我在该方法中调用另一个方法,则会发生此错误,即使我没有将引用作为参数传递.
错误:将'const A'作为'void A :: hello()'的'this'参数传递,丢弃限定符[-fpermissive]
错误:将'const A'作为'void A :: world()'的'this'参数传递,丢弃限定符[-fpermissive]
#include <iostream>
class A
{
public:
void sayhi() const
{
hello();
world();
}
void hello()
{
std::cout << "world" << std::endl;
}
void world()
{
std::cout << "world" << std::endl;
}
};
class B
{
public:
void receive(const A& a) {
a.sayhi();
}
};
class C
{
public:
void receive(const A& a) {
B b;
b.receive(a);
}
};
int main(int argc, char ** argv)
{
A a;
C c; …Run Code Online (Sandbox Code Playgroud) 我正在学习函数对象,我正在通过自己编写std::transform 来尝试这个。我创建了一个增量结构。我将从这个结构创建一个对象,并将它用作我的转换函数参数中的函数对象。
这是我的增量结构:
template<typename T>
struct Increment
{
T by_what;
void increment(T& item)
{
item += by_what;
}
void operator() (T& item)
{
increment(item);
}
};
Run Code Online (Sandbox Code Playgroud)
这是我的免费转换功能:
template<typename T>
void transform(std::vector<T>& container, Increment<T> inc)
{
for(auto& item : container)
inc(item);
}
Run Code Online (Sandbox Code Playgroud)
但是我不想复制inc对象,也不想更改它的任何内容。这就是为什么我想const Increment<T>& inc在参数中写入但编译器不让我写。
这是我的主要功能:
int main()
{
auto v1 = std::vector<int>{10, 20, 30};
auto inc = Increment<int>{5};
transform(v1, inc);
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
week5-app2.cpp:50:9: 错误: …