vector 返回 0 的 size()

vector is returning a size() of 0

我是 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;
}

我的目标是使用 addr() 方法将 vector 中的所有数字相加,但由于某种原因 vector 的大小在 addr() 方法,所以我最终打印了这些非常大的数字:

15152333321

这是怎么回事?会不会是它一开始就没有用 vector 初始化?

如@Eljay 所述,在 Absolute 构造函数中,您的参数和成员变量具有相同的名称。

这个变化

        Absolute(vector<int> nums) { 
            this->nums = nums; //<--- this size is not 0
        }

如果您真的想保留相同的名称,那么您的示例应该足够了。我强烈建议您为参数取一个不同的名称,例如 _nums

在此代码中:

Absolute(vector<int> nums)
{
    nums = nums; 
}

你遇到我说的“汉兰达法则”(There can be only one). In this function, nums refers to the parameter nums, not the member nums. The member nums is shadowed,隐藏,被参数。所以nums = nums;表示把参数赋值给自己。成员nums不变,保持大小为 0。

修复:您可以更改其中一个变量的名称,以免它们发生冲突。您可以使用 this->nums = nums 更加明确,但还有一个更好更快的选择:使用 member initializer list 并使用正确的值初始化成员 nums 而不是将其初始化为默认值然后赋值它。

Absolute(vector<int> nums): nums(nums)
{
}

这里可以使用相同的名称,因为没有歧义。正在初始化成员 nums,因此它必须是 left-most nums。它被初始化为参数nums,因为该参数是标识符nums.

的当前持有者

旁注:考虑通过引用传递并为自己保存一份副本:

Absolute(const vector<int> & nums): nums(nums)
{
}