【问题标题】:passing class objects in C++在 C++ 中传递类对象
【发布时间】:2015-07-27 18:52:42
【问题描述】:

我正在学习 C++ 课程,但我被困在类和对象上。我正在做一个任务,简而言之,它创建了一个包含两个变量(比如说长度和宽度)的类。

我已经想出了如何使用 get 和 set 函数来做到这一点。但是,我们必须对这些变量使用数学。我们应该编写一个函数,将类的一个实例作为参数(所以两个变量),然后对这个对象(作为参数的那个)和调用方法的对象进行数学运算。

我感到困惑的部分原因是语言,我不确定这到底是什么意思。到目前为止,就像我说的那样,我最终能够通过用户输入设置 setLength 和 setWidth 变量。我真的,真的坚持尝试将这些值(或这个对象?)传递给一个函数,然后调用另一个对象的方法?

也许有人可以帮我弄清楚“将对象作为参数,然后对我称之为方法的对象进行数学运算”是什么意思?还是只是帮助传递对象?

【问题讨论】:

  • 例如想想string(或std::string)。我可以说string myString = "test"; 并将字符串设置为“test”。这意味着什么?字符串是一个对象,由一个类创建(或实例化)。它包含一个指向内部字符数组的指针(大概),并定义了与其他字符串交互的函数。例如,我可以说myString.compare(anotherString),它将获取字符串类的另一个对象并将自己与该字符串进行比较,然后返回int
  • “我想如果我可以参与对话并提出问题,这将有助于我理解!” 那么您不是在寻找问答库,而是在聊天室。幸运的是,我们这里有一些……

标签: c++ object c++11 reference parameter-passing


【解决方案1】:

传递一个对象就像传递其他类型的变量一样。如果您将整数传递给函数,您将使用以下语法来声明函数:

void myFunction(int myInt);

如果你传入一个 Foo 类的对象,它会是:

void myOtherFunction(Foo myFoo);

这有点像说,“这是我希望你在计算中使用的东西。复制我在这里传入的对象!。改为通过引用传递:

void myFunction(int &myInt);
void myOtherFunction(Foo &myFoo);

允许你修改你传递的值。对于较大的对象,它也比 按值传递 便宜得多,这是这个答案中的原始语法。你可以把它想象成你对计算机说:“我知道你想要这个值,但我不会让你复制这个。相反,只要看看 那里,你就会找到我想让你一起工作的东西。”但有时你不想修改你正在使用的东西!

当然,你可以非常小心在你的函数中避免改变东西,但是 C++ 语言让你说你不应该修改变量,然后会检查你不给你修改!

这可以通过使用来完成

void yetAnotherFunction(const Foo &myFoo);

const 表示“不要让我被修改!”到编译器,编译器会监听。


假设您想使用(非成员)函数为一个简单对象分配一些值:

// a struct should usually hold simple groups of data, 
// that don't do much by themselves. Their members are 
// also public by default.
struct MySimpleType{ 
    int first;
    int second;
};

// object is passed by reference so it can be modified.
void modifier(MySimpleType &object, int newFirst, int newSecond){
    object.first = newFirst;
    object.second = newSecond;
}

然后在您的客户端代码中(可能是main 函数,在您的编码生涯中),您可以这样做:

MySimpleType object;

modifier(object, 13, 12);

cout << object.first << ", " << object.second;

应该打印出来:

13, 12

【讨论】:

  • 如果您的对象很大,并且您不想更改它,请通过const 参考:void myOtherFunction(const Foo &amp;myFoo);
  • 谢谢。所以,如果我只是创建一个类对象并尝试将它传递给一个函数,什么都不会发生,因为仅仅通过创建对象你不一定要分配任何参数,对吧?所以就我而言,我正在接受用户输入。我似乎无法弄清楚如何将此用户输入“分配”给对象。所以在上面的例子中,我从用户输入中获取了 setLength 变量。我不知道如何将这些变量分配给一个新对象,以便对象传递,用户输入(以变量的形式)随之传递!谢谢!
  • @user877329 已编辑以包含 const 解释。感谢您指出我错过了。
  • @FKAjasmine 为您的类提供成员函数get(std::istream& is),以允许从输入流中读取成员值。
  • @FKAjasmine 已编辑以包含在函数中设置类成员的示例。
【解决方案2】:

首先将代码片段视为“对象”可能很困难,但它可能是您学习的最重要的东西之一(因为面向对象的编程在工业和学术界广泛使用)。为了在 c++ 中有效地使用对象,您需要了解很多背景知识,但我会尽量简要介绍一下..

首先,了解“类”和“对象”之间的区别很重要。类是允许您定义对象的抽象。如果我想创建一个Horse 对象,我会使用Horse 类来定义关于马的重要性。此类可能具有定义其名称、所有者、头发颜色等的字段。但是,Horse 类不是马。它告诉你成为Horse 意味着什么,但它不是一个。为了定义Horse 类型的“对象”,我们将编写以下代码:

Horse myHorse = new Horse("Sea Biscuit", "Howard", "Black");

请记住,Horse 是类,但 Sea Biscuit 是马本身(对象)。

您可能很清楚上述内容,但它通常是一个难以掌握的概念,所以我想我会提到它。

现在,如果您想对某些对象执行数学运算,使用成员函数相对简单。让我们定义一个新的类来做一些数学运算(因为马和数学不能混用)。

class Wallet
{
    int _pennies;

    // This is a constructor. It allows us to write: Wallet myWallet(100);
    public Wallet(int pennies)
    {
        _pennies = pennies;
    }

    public void addPennies(int pennies)
    {
        _pennies = _pennies + pennies;
    }

    public void stealPennies(Wallet &stolenWallet)
    {
        int stolenPennies = stolenWallet._pennies;
        stolenWallet._pennies = 0;

        this.addPennies(stolenPennies);
    }
}

我们现在可以创建一些对象,并通过一次调用 stealPennies 来修改两个对象中的字段:

int main()
{
    Wallet myWallet(10); // Creates a wallet with 10 cents.
    Wallet anotherWallet(50); // Creates another wallet with 50 cents.

    myWallet.stealPennies(anotherWallet);
    // myWallet now has 60 cents, and anotherWallet has none.
}

注意:stealPennies 函数中参数名称前的&amp; 表示它将通过引用传递。通常,当您将参数传递给函数时,它是由 value 传递的,这意味着函数中的变量是您传递的参数的副本。将&amp; 放在参数名称之前意味着函数中的变量是同一个变量而不是副本。 (这是高度简化的。在您熟悉指针之前,您不太可能完全理解通过引用传递)。此外,在定义属于类的变量时,通常会使用某种命名约定。在变量名前加下划线很常见(例如本例中的_pennies)。

希望这对您有所帮助(希望它有效,因为我目前无法对其进行测试)。我试图使代码尽可能地可读和明确。

【讨论】:

  • 读起来很迷茫,毫无关联。
【解决方案3】:

根据您的评论:

" 我似乎无法弄清楚如何将此用户输入“分配”给对象。因此在上面的示例中,我从用户输入中获取了 setLength 变量。我无法弄清楚如何分配这些变量传递给一个新对象,这样对象就被传递了,用户输入(以变量的形式)也随之传递!”

我认为你真正需要的是一些函数来通过读取std::istream 来操作你的类成员变量,并将目标对象实例作为引用传递:

class foo {
public:
    foo() : x(12), y(42.0) {}
private:
    friend std::istream& operator>>(std::istream& is, foo& subject);
    std::istream& getfrominstream (std::istream& is) {
        is >> x;
        is >> y;
        return is;  
    }
    int x;
    double y;
};

std::istream& operator>>(std::istream& is, foo& subject) {
   return subject.getfrominstream(is);
}

调用方式:

int main() {
    foo f;
    std::cin >> f;
}

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2011-07-27
    • 2015-02-01
    • 1970-01-01
    相关资源
    最近更新 更多