C++编程问题请大神赐教谢谢

代码如下,为什么形参 const std::string & co 要用引用,直接const std::string co 不行吗,company = co,不是一样吗?
void stock::acquire(const std::string & co, long n, double pr) {
company = co;
if (n < 0) {
std::cout << "Number of shares can't be negative;"
<< company << "shares set to 0.\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}

引用用变量本身,传非引用参数时,在内存中会把你伟入的变量复制一份传到函数中,并不是你原来定义的那一个变量了 虽然内容是一样的,但是指针不同,
这时如果不加const,你去修改入参,函数之前定义的那个变量值不会改变,

void test(string &str)
{
//str是传入变量的本身
str="cba";
}
void test1(string str)
{
//str是原来变量的一个复制体
str="cba";
}
main中:
string str="abc";
test1(str);//str="abc";
test(str);//str="cba";

首先来解释 下这里面有 的两个 CONST ,第一个 与 STD::STRING 在一起, 就像 CONST INT 一样,,只不过这里 INT 换成了 STD::STRING 而以,,第二个CONST 表示在 这个GETID 函数 不会对调用者数据造成修改 。MSDN 中的解释 如下:
const
const declaration
member-function const
When modifying a data declaration, the const keyword specifies that the object or variable is not modifiable. When following a member function's parameter list, the const keyword specifies that the function doesn't modify the object for which it is invoked.
然后再来说下 引用:在C++ PRIMER 4 里面有 跟下面 差不多的话,
CONST引用与非CONST引用

我们可以定义变量如:
INT I=10; 同理可以定义其引用如:
INT & REFI=I; (1) 这样,我们就可以操纵这个引用了,可以通过REFI 来修改I 的值。

通过上面的例子,我们要明白,非CONST引用可以修改它绑定的值。
同理:
我们可以定义CONST对象如:
CONST INT I=10;
同理我们可以定义引用来绑定到这个CONST对象 如:
INT & REFI =I;(2)
比较(1)(2)两个表达式,是一样的,也就是说在表达式(2) 定义完之后,我们同样可以通过REFI 改变 I的值。这与我们的I 被定义成 CONST 是相违背的。所以我们规定:
将非CONST引用绑定到CONST对象是不合法的。
CONST引用可以初始化为不同类型的对象或者右值,如字面值常量。

非CONST引用只能绑定到与该引用同类型的对象。
CONST引用则可以绑定到不同但相关的类型的对象或绑定到右值。

以上部分摘自C++ PRIMER 4

解释了引用 CONST引用 与 非CONST引用

所以 说 还是要 仔细的看书,,,

你这里面的 & 表示 的是 引用 。而且 是 CONST 引用。

co是个string类型,可以理解为char * 类型,所以需要传入的是字符串的首位地址,所以用引用,传入的就是字符串的指针。

首先就你这个例子来说,不用引用也可以,而这个地方之所以用引用是从效率和语义上考虑。
从效率上讲:引用只是指针的语法糖,编译之后,string & co等同于string * co。使用引用实际上只是传送了一个string字符串的地址,
不用的话是赋值,相当于内存中复制了一份string字符串
从语义上讲:由于参数co使用了const,也就是说函数内部不会改变co的值,只是参考借用(refer)下这个值,所以引用的语义更贴切一下

形参如果不使用饮用则是“值传递”,属于内存中保留了一份原变量的拷贝,拷贝的变化不影响原变量,c和c++都可以通过指针作为参数来达到改变原变量值的效果,而c++更偏向使用引用。