在C ++中传递类对象

时间:2015-07-27 18:52:43

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

我参加C ++课程并且我坚持上课和对象。我正在完成一项任务,简而言之,它创建了一个带有两个变量的类(让我们说长度和宽度)。

我已经弄清楚如何使用get和set函数执行此操作。但是,我们必须对这些变量使用数学。我们应该编写一个函数,该函数将类的一个实例作为参数(因此有两个变量),然后对这个对象(作为参数的对象)和被调用方法的对象进行数学运算。

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

也许如果有人可以帮我找出什么"将一个对象作为一个参数,然后对该对象进行数学运算,我称之为"手段?或者只是帮助传递对象?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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表示它将通过引用传递。通常当您将参数传递给函数时,它会通过 value 传递,这意味着函数中的变量是您传递的参数的副本。将&放在参数名称之前意味着函数中的变量是相同的变量而不是副本。 (这是高度简化的..在你熟悉指针之前,你不太可能完全理解通过引用传递。此外,通常的做法是在定义属于类的变量时使用某种命名约定。在变量名之前加上下划线很常见(例如本例中的_pennies)。

希望这对你有帮助(并希望它有效,因为我现在无法测试它)。我试图使代码尽可能可读和明确。

答案 2 :(得分:1)

从你的评论开始:

  

&#34;我似乎无法弄清楚如何分配&#34;此用户输入到对象。所以在上面的例子中,我有从用户输入中获取的setLength变量。我无法弄清楚如何将这些变量分配给一个新对象,以便对象通过,用户输入(以变量的形式)与它一起传递!&#34;

我认为你真正需要的是通过从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;
}