当修改数组中的类元素时,它的行为就像是副本,而不是引用
when a class element from array is modified, it behaves like it is a copy, not reference
这是
一件简单的事情,我不确定它是否像在其他语言中一样C++中可行。该事物的行为就像是副本,但不是同一个对象。我希望如果这是结构或其他一些值类型 - 这将是预期的行为,但对于类,我希望它的行为就像我在看"引用"一样,也就是说 - 与数组中的对象相同。我做错了什么?
// Example program
#include <iostream>
#include <string>
class someclass
{
public:
void setn(int n2);
int n=10;
};
void someclass::setn(int n2){
n=n2;
};
int main()
{
someclass moreofthem[5];
someclass my=moreofthem[1];
std::cout << "start value: " << my.n << " as initaln"; //10
my.setn(2);
std::cout << "new value: " << my.n << " as expectedn"; //2
std::cout << "value in list: " << moreofthem[1].n << " why?n"; //10?
}
与 C# 不同,C++ 不区分struct
和class
。事实上,这两者是完全可以互换的,并且遵循价值语义。
幸运的是,C++还提供了引用和指针作为语言构造,这使您可以处理对类和结构实例的引用:
someclass moreofthem[5];
someclass& my = moreofthem[1];
// ^
// That's it! Now you have yourself a reference
std::cout << "start value: " << my.n << " as initaln"; //10
my.setn(2);
或者如果您更喜欢指针
someclass moreofthem[5];
someclass* my = &moreofthem[1];
// ^ ^
// declare and use a pointer; note -> below
std::cout << "start value: " << my.n << " as initaln"; //10
my->setn(2);
与 C# 不同,在 C# 中,class
确保通过引用(表示C++引用和C++指针之间的混合)处理实例,C++允许您决定如何处理实例 - 按值、按引用或按指针。该行为接近于 C# 对值类型的对象的ref
参数传递,但它在所有上下文中都可用,包括实例和局部变量。这使您可以更灵活地通过引用或不同上下文中的值处理同一对象。
那是因为对象my
是moreofthem[1]
的副本,而不是引用。
如果你想要一个引用,你需要在定义变量时使用与号:
someclass& my=moreofthem[1];
// ^
// Note ampersand here
我希望如果这是结构或其他值类型 - 这将是预期的行为,但对于课堂来说,...
关键字class
和struct
可以互换使用。唯一的区别是,如果您不指定访问修饰符,则默认将是:
-
public
struct
-
class
private
可是
someclass& my=moreofthem[1];
做一个参考,这就是你正在寻找的。在这里,引用my
就像原始变量的别名moreofthem[1]
相关文章:
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 标准库容器结构是否存储副本或引用?
- 如何声明接受转发引用并返回引用或副本的函数模板
- 如何在我的源代码中找到所有发生的情况,其中std :: string被传递给方法作为副本而不是恒定引用
- 取消引用指针以创建数组的副本
- 返回不带副本 ctor 的引用
- 为什么在C 11中推荐的值(如果需要副本),如果const引用也只花费单个副本,则建议通过值(如果需要副本)
- 如何通过制作副本从函数返回引用
- 可以在同一函数中引用副本本地变量是否可以
- 为什么从三元文字中绑定到const引用副本
- 传递常量引用与创建临时常量副本相同,那么为什么要传递常量引用
- 为什么在 constexpr 函数中允许返回对常量指针的引用,但不返回副本
- 初始化引用时何时以及为何获得副本
- 处理对“vector_binary_operation”类中“表达式”的引用,而无需不必要的副本
- 按方法返回副本或引用
- 您能否从抽象引用创建具体对象的副本
- 常量引用和创建副本
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员