const string&的区别和字符串&没有const

时间:2014-11-22 23:14:05

标签: c++ vector const parameter-passing pass-by-reference

我写了一个代码来计算两个向量的标量积。我似乎无法完全理解通过引用和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];
    }
}

2 个答案:

答案 0 :(得分:3)

"First "是一个字符串文字。当从该字符串文字构造std::string时(为了调用您的函数),结果是临时的,临时值不​​能绑定到非const引用。

至于通过引用传递向量,如果你愿意,可以传递一个副本(因为你无意在函数中修改它们),但是这个副本是不必要的CPU浪费时间和记忆!我实际上将向量作为const std::vector&传递,以便强制无法在不应该的函数中修改它们。

答案 1 :(得分:0)

字符串&#34; First&#34; &安培; &#34;第二&#34;是常量....从它们构造的字符串对象是临时对象,它们的值无法修改,因此您无法将它们传递给采用非常量引用的方法。

如果您没有通过引用传递向量,那么您的输入值方法将获取副本,并且向量U&amp;传递给entervalues()的V将保持不变。