我是 C++ 编程的新手,但在使用以下代码时遇到了问题:
#include <iostream>
#include <vector>
using namespace std;
class Absolute {
public:
vector<int> nums;
Absolute(vector<int> nums) {
nums = nums; //<--- this size is not 0
}
vector<int> getNums() { return nums; }
int addr() {
int total = 0;
for(int i=0; i<nums.size(); i++) { //<--- nums.size() here is 0 even though it should not be
total += nums[i];
}
return total;
}
};
int main() {
vector<int> numbers = {1, 3, 3, 4, 5, 6, 7, 8}; //<--- passing this to addNums but still returns size of 0
Absolute addNums = Absolute(numbers);
cout << addNums.addr() << endl;
return 0;
}
我的目标是vector
使用该addr()
方法将所有数字相加,但由于某种原因vector
,该方法内部的大小为 0 addr()
,所以我最终打印了这些非常大的数字:
15152333321
这里发生了什么?难道是它一开始就没有被初始化vector
吗?
在这段代码中:
Absolute(vector<int> nums)
{
nums = nums;
}
你遇到了我所说的“汉兰达法则”(只能有一个)。在这个函数中,nums
指的是参数nums
,而不是成员nums
。该成员nums
被参数遮蔽、隐藏。所以nums = nums;
意味着将参数分配给自身。成员nums
不变,大小保持为 0。
修复:您可以更改其中一个变量的名称,以免它们发生冲突。您可以更明确地使用this->nums = nums
,但有一个更好更快的选择:使用成员初始化器列表并使用正确的值初始化成员nums
,而不是将其初始化为默认值然后分配它。
Absolute(vector<int> nums): nums(nums)
{
}
您可以在此处使用相同的名称,因为没有歧义。该成员nums
正在初始化,因此它必须是最左边的nums
. 它被初始化为参数nums
,因为参数是标识符的当前持有者nums
。
旁注:考虑通过引用传递并为自己保存一份副本:
Absolute(const vector<int> & nums): nums(nums)
{
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句