【问题标题】:The difference between const string& and string& without the constconst string& 和不带 const 的 string& 的区别
【发布时间】:2015-01-20 21:54:30
【问题描述】:

我写了一个代码来计算两个向量的标量积。我似乎无法完全理解引用传递和 const。当我输入 void entervalues 函数的参数时,一个 void entervalues(string& vect, vector& vectt);没有 const,它不会编译。当我输入 void entervalues(const string& vect, vector& vectt);在字符串之前加上 const,它会编译。为什么是这样?以及为什么放 & 更好。为什么我不能只输入 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];
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      字符串 "First" 和 "Second" 是常量......从它们构造的字符串对象是临时的,它们的值不能修改,因此你不能将它们传递给采用非常量引用的方法.

      如果您不通过引用传递向量,那么您的 enter values 方法将进行复制,并且传递给 entervalues() 的向量 U 和 V 将保持不变。

      【讨论】:

      • +-1:这不正确。无论如何,字符串文字永远不会被修改,因为它是一个[可变的] std::string,必须从它们构造才能进行函数调用。即函数不取char*const char*。最后,scalar 没有修改 uv 所以你的推理也是错误的。
      • 对不起,我的意思是 entervalues() 显然,因为标量 () 无论如何都不会通过引用获取值。我关于使用字符串文字传递给函数的字符串对象的观点是有效的,如果过于简单的话......更新了答案以反映这一点。
      • 完全错误。您现在已将您的观点替换为我 21 小时前在回答中所写的完全不同的正确观点。 :)
      • 确实,但是说错了,你说:“如果你愿意,你可以传递一个副本(因为你无意在函数中修改它们)”......谈论 entervalues () ,其全部目的是填充向量,然后传递给 scalar () ;-)
      • 是的。你会看到我已经删除了那个答案。要么我误读了这个问题,要么它曾经在该段落中指代scalar。移动应用程序没有向我显示要检查的转速历史记录:(
      猜你喜欢
      • 2010-12-29
      • 2016-06-25
      • 1970-01-01
      • 2021-12-28
      • 2021-06-10
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多