我参加C ++课程并且我坚持上课和对象。我正在完成一项任务,简而言之,它创建了一个带有两个变量的类(让我们说长度和宽度)。
我已经弄清楚如何使用get和set函数执行此操作。但是,我们必须对这些变量使用数学。我们应该编写一个函数,该函数将类的一个实例作为参数(因此有两个变量),然后对这个对象(作为参数的对象)和被调用方法的对象进行数学运算。
我迷惑的部分原因是语言,我不确定这意味着什么。到目前为止,就像我说的那样,我设法能够通过用户输入设置setLength和setWidth变量。我真的,真的坚持尝试将这些值(或这个对象?)传递给一个函数,然后调用另一个对象的方法?
也许如果有人可以帮我找出什么"将一个对象作为一个参数,然后对该对象进行数学运算,我称之为"手段?或者只是帮助传递对象?
答案 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;
}