在类的函数中使用类的对象

C++ Using an object of a class within a function of that class

本文关键字:对象 函数      更新时间:2023-10-16

假设我有一个头文件,看起来像:

# filename: header.h
class myclass
{
 public:
    int myVariable; # arbitrary member variable
    foo(); # arbitrary function
    myclass() # default constructor
}

现在假设我想在一些。cpp文件中实现我的构造函数[myclass()]:我能不能创建一个数组,对象的数组,整型的数组等等,就一个数组。然后我可以循环遍历数组并在构造函数定义中填充吗?

我问的原因是因为我希望我的任意成员函数foo()能够改变这个数组。这就导致了问题-我是否将myclass的对象传递给foo [foo(myclass myclasssobject) ?

或者我把这个对象的数组传递给foo() ?

对此的任何澄清将不胜感激。我尽量让这个例子不针对特定情况,但仍然具有足够的描述性,以便每个人都能理解这个问题。谢谢你!

是的,您可以在构造函数中创建和"填充"数组,以便foo可以使用它。实际上,这就是构造函数的目的(为您设置一切)。

请注意,如果您希望foo()能够使用数组,则必须使数组成为类定义的一部分。

myclass.h

class myclass {
    private:
        int* arr; // declared on the "heap"
    public:
        foo();
        myclass(int arraySize);
};

myclass.cpp

#include "myclass.h"
#include <stdio>
myclass::myclass(int arraySize) :arr(new int[arraySize]) {}
myclass::foo() {
    // prints the elements of the array we declared earlier
    for (int i = 0; i < 5; i++) {
        std::cout << arr[i] << std::endl;
    }
}

你的构造函数确实可以创建一个数组——问题是在构造函数返回后数组发生了什么。

  • 一种合理的方法是将其保存在堆上-即使用new[]创建数组-但这意味着您需要保持指向数组的指针以便之后访问它。最简单的方法是向类成员数据添加一个指针对象。然后foo()可以使用该指针访问数组。不幸的是,你必须使用自定义复制构造函数、赋值操作符和析构函数(google规则三)或智能指针来确保数组的正确复制、共享和销毁。

  • 你的问题暗示我,你不只是想要一个数组数据成员,这当然是最简单的解决方案。这样做的缺点是数组大小必须在编译时选择,而基于堆的数组可以在运行时确定大小。

  • 如果你在堆栈上创建它,那么它将离开作用域并且之后不可访问(当它在作用域内时,任何通过指针或引用设置访问它的尝试都会导致未定义的行为)。

  • 构造函数也可以在静态数组中填充数据,但显然数组的生命周期独立于类的任何单个对象实例。你已经讨论过构造函数创建数组,所以大概不想这样做。