向量返回的 size() 为 0

IC维纳

我是 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吗?

用户4581301

在这段代码中:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章