我刚开始学习Java,我遇到的第一件事是foreach循环,不知道它的工作方式我做的第一件事是:
int[] array = new int [10];
for (int i: array){
i = 1;
}
Run Code Online (Sandbox Code Playgroud)
显然无法分配1给数组的每个元素.然后我添加System.out.print(i);(后i = 1;)到循环的主体,看到屏幕的输出是,1111111111但因为i在循环内做一些事情是有效的,很可能i是数组的每个元素的副本,不是吗?(第一个问题)
如果上述情况属实,这并不意味着foreach循环比公共for循环要慢得多,因为它涉及制作数组中每个元素的副本?或者既然Java没有指针和指针算术,oprator[]可能会以其他一些"糟糕"的方式设计复制每个元素实际上更快?
如果上述假设为真,为什么人们会使用明显较慢的foreach循环而不是共同的for循环呢?
简而言之:
是i每个元素的副本array吗?如果不是那么呢?
foreach循环不是比普通循环慢吗?如果没有,那么operator[]设计的"糟糕"程度如何?
除了在foreach循环中获胜的可读性之外别无其他吗?
在java中使用以下代码
public Polynomial multiply(Polynomial aPolynomial){
Polynomial ret = new Polynomial();
for (Tuple i: this.pol){
Polynomial temp = aPolynomial.clone();
System.out.print(temp);
for (Tuple j: temp.pol){
j.setCoef(j.getCoef() * i.getCoef());
j.setPower(j.getPower() + i.getPower());
}
ret = ret.add(temp).clone();
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出System.out.print(temp)总是不同的值.这意味着aPolynomial在运行时期间某处改变了get.
更改Polynomial temp = aPolynomial.clone();到:
LinkedList<Tuple> list1 = (LinkedList<Tuple>) aPolynomial.pol.clone();
Polynomial temp = new Polynomial(list1);
Run Code Online (Sandbox Code Playgroud)
System.out.print(temp)在每次循环运行时,输出也没有帮助.
我的错误在哪里?
编辑:
public Polynomial clone() {
try {
return (Polynomial)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
} …Run Code Online (Sandbox Code Playgroud) 调用循环的代码:
Foo temp = Foo(token.substr(0,i));
this->leftExpression = temp;
Run Code Online (Sandbox Code Playgroud)
已经Foo声明为:
class Foo{
private:
std::string expr;
std::vector <Bar*> tokens;
std::vector <std::string> stringtoken;
Run Code Online (Sandbox Code Playgroud)
并且CCTOR调用循环:
Foo::Foo(const Foo& a_expr){
this->expr = a_expr.expr;
this->tokens = a_expr.tokens;
this->stringtoken = a_expr.stringtoken;
}
Run Code Online (Sandbox Code Playgroud)
什么是调用这个循环?
编辑:
作业运营商:
Foo& Foo::operator=(const Foo& a_expr){
Foo temp(a_expr);
std::swap(*this, temp);
return (*this);
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码
cv::initModule_nonfree();
std::vector<cv::KeyPoint> keypoints_1;
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("SURF");
cv::Mat image = cv::imread("someFileNameHere",cv::IMREAD_COLOR);
// image.data is true, cv::imshow() dispalys the image
detector->detect(image, keypoints_1); // seg fault here
Run Code Online (Sandbox Code Playgroud)
段错误的原因可能是什么?我尝试在它上面运行 gdb,希望库有足够的元数据,但堆栈在调用detect()
我不知道为什么这个代码应该工作,但如果我想要将两个对象一起添加,请告诉我该怎么做.请.当你试图回答时请更专注于菜鸟
抱歉我的英语不好,我是印度人,这是我的代码.
#include<iostream>
using namespace std;
class time
{
private:
int sec;
int mint;
int hours;
public:
int Inputsec;
int Inputmint;
int Inputhours;
time(int Inputsec, int Inputmint, int Inputhours):sec(Inputsec), mint(Inputmint), hours(Inputhours){};
time operator+(time Inputobj)
{
time blah (sec+Inputsec,mint+Inputmint,hours+Inputhours);
return blah;
}
void DisplayCurrentTime()
{
cout << "The Current Time Is"<<endl<< hours<<" hours"<<endl<<mint<<"minutes"<<endl<<sec<<"seconds"<<endl;
}
};
int main()
{
time now(11,13,3);
time after(13,31,11);
time then(now+after);
then.DisplayCurrentTime();
}
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但它给了我可怕的输出.我的错误在哪里?
class Foo{
void operator=(const Foo&){};
public:
Foo(){};
};
Foo& fooRef(){
static Foo aFoo;
return aFoo;
}
int main() {
Foo &foo = fooRef();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码正常工作,不会发出任何错误.一旦我将主体改为:
int main(){
Foo &foo;
foo = fooRef();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器尝试使用operator=并因此抱怨.所以我的第一个问题是:它为什么会有所作为?
我来到这个事实的方式是我在做单元测试使用CPPunit,我一定要考有签名一个单独的类getInstance()是Singleton& getInstance().为了进行测试,我试图在TestSingleton类中单例初始化一个实例.因此有:
class TestSingleton{
...
private:
Singleton &instance;
};
void TestSingleton::setUp(){
this->instance = Singleton::getInstance();
}
Run Code Online (Sandbox Code Playgroud)
以上示例发出错误(因为operator=声明为私有,如果不是,则很明显我不会被调用).所以第二个问题是:我如何避免这种情况并在我的TestSingleton班级中获得单身实例?