我写了一个代码来计算两个向量的标量积。我似乎无法完全理解通过引用和const传递。当我输入虚空的参数时,输入值的函数是一个无效的输入值(字符串& vect,vector& vectt);没有const,它不会编译。当我输入void entervalues(const string& vect,vector& vectt);在字符串之前的const,它编译。为什么是这样?为什么放入&amp ;.更好。为什么我不能把void entervalues(string vect,vector vectt); ?
我的代码是:
void entervalues(const string& vect, vector<double>& vectt);
double scalar(vector<double> u, vector<double> v);
double ask_number(int N_MAX){
int n;
do{ cout << "Enter a size for the vectors between 1 and " << N_MAX << endl;
cin >> n; }while((n < 1) or (n > N_MAX));
return n;
}
int main(){
vector<double> U(ask_number(20));
vector<double> V(ask_number(20));
entervalues("First ", U);
entervalues("Second ", V);
cout << "Scalar product is " << scalar(U,V) << endl;
return 0;
}
double scalar(vector<double> u, vector<double> v){
double sum(0.0);
for(size_t i(0); i < u.size(); ++i){
sum = sum + u[i]*v[i];}
return sum;
}
void entervalues(const string& vect, vector<double>& vectt){
cout << vect << "vecteur: " << endl;
for(size_t i(0); i < vectt.size(); ++i){
cout << "Coordonates: " << i+1 << endl;
cin >> vectt[i];
}
}
答案 0 :(得分:3)
"First "
是一个字符串文字。当从该字符串文字构造std::string
时(为了调用您的函数),结果是临时的,临时值不能绑定到非const
引用。
至于通过引用传递向量,如果你愿意,可以传递一个副本(因为你无意在函数中修改它们),但是这个副本是不必要的CPU浪费时间和记忆!我实际上将向量作为const std::vector&
传递,以便强制无法在不应该的函数中修改它们。
答案 1 :(得分:0)
字符串&#34; First&#34; &安培; &#34;第二&#34;是常量....从它们构造的字符串对象是临时对象,它们的值无法修改,因此您无法将它们传递给采用非常量引用的方法。
如果您没有通过引用传递向量,那么您的输入值方法将获取副本,并且向量U&amp;传递给entervalues()的V将保持不变。