我到处都读过必须初始化引用然后再进行初始化.
为了测试我的理解,我写了以下小程序.似乎我已经成功地重新分配了一个引用.有人可以向我解释我的程序中实际发生了什么吗?
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
int i = 5, j = 9;
int &ri = i;
cout << " ri is : " << ri <<"\n";
i = 10;
cout << " ri is : " << ri << "\n";
ri = j; // >>> Is this not reassigning the reference? <<<
cout << " ri is : " << ri <<"\n";
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码编译正常,输出正如我所期望的那样:
ri is : 5 …
Run Code Online (Sandbox Code Playgroud) 如果我使用相同类型的typedef,则以下代码在应用于const
返回值引用时会起作用,value_type&
但会出现错误.
举个例子:
class T {
};
class A {
public:
typedef T value_type;
typedef value_type& reference;
// Not working
const reference operator*() const;
// But this works?
//const value_type& operator*() const;
};
// Error!
const typename A::reference A::operator*() const {
}
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
g ++会出错:
'const' qualifiers cannot be applied
Run Code Online (Sandbox Code Playgroud)
我的实际代码使用模板,但我删除了示例和替换类T
.这与错误无关.
我不明白为什么这不起作用如果指定value_type&
编译好.
有没有一种简单的方法将非const C++结构(通过指针)传递给函数,并确保该函数不能更改结构的成员?
例如:从配置文件加载结构,这需要结构为非const.但是然后一个指向结构的指针被传递给一个不允许改变任何东西的函数.
我已经通过创建结构的第二个逐字"const"副本,并且繁琐地复制每个成员来看到这一点.这看起来很奇怪.我是C#程序员,所以也许这就是它在C++中完成的方式......?
最近我一直在学习C++中的优秀编程实践,并发现许多程序通过引用将对象传递给函数,因此不会创建多个实例.我还了解到,传递一个常量引用可以防止原始对象被修改但是我不明白它是如何工作的.不应该是常量引用创建一个新实例,因为原始对象不能通过引用修改,但引用仍然可以像单独的对象一样使用?我很确定这不是它的工作原理但是,它是如何工作的?我错过了什么吗?