如何在C++中使用类对象作为函数参数

Jam*_*mes 32 c++ parameters

我不知道如何有一个接收类对象作为参数的函数.有帮助吗?以下是一个例子.

#include<iostream>

void function(class object); //prototype

void function(class tempObject)
{
   //do something with object
   //use or change member variables
}
Run Code Online (Sandbox Code Playgroud)

基本上我只是混淆了如何创建一个函数,它将接收一个类对象作为其参数,然后在函数内部使用这些参数,如tempObject.variable.

对不起,如果这有点令人困惑,我对C++比较陌生.

CB *_*ley 38

class是一个仅用于*来引入类定义的关键字.将新类实例声明为本地对象或函数参数时,只使用类的名称(必须在范围内)而不是关键字class本身.

例如

class ANewType
{
    // ... details
};
Run Code Online (Sandbox Code Playgroud)

这定义了一个名为ANewTypeclass类型的新类型.

然后,您可以在函数声明中使用它:

void function(ANewType object);
Run Code Online (Sandbox Code Playgroud)

然后,您可以将类型的对象传递ANewType给函数.该对象将被复制到函数参数中,因此,与基本类型非常相似,任何修改参数的尝试都只会修改函数中的参数,并且不会影响最初传入的对象.

如果要根据函数体中的注释修改函数外部的对象,则需要通过引用(或指针)获取对象.例如

void function(ANewType& object); // object passed by reference
Run Code Online (Sandbox Code Playgroud)

这种语法意味着object函数体中的任何使用都是指传递给函数而不是副本的实际对象.所有修改都将修改此对象,并在函数完成后可见.

[*class关键字也用于模板定义,但这是一个不同的主题.]

  • 但是,当他使用class关键字时,它并不像非法.以下是一个完全有效的TU:`void f(class foo);`.如果还不知道"foo",那么它将被引入那里,所以它是一个不常见的地方的前向声明. (3认同)
  • @litb:100%正确,但可能比对初学者有用的更多。我有一些C ++的经验,但是如果我在野外遇到`void f(class foo);`,我会做两次或三次尝试。 (2认同)
  • 完美,感谢您的扩展解释。非常感激! (2认同)
  • @tonix 可能有点晚了,但对于任何其他偶然发现此 Node*&amp; 的人来说,意味着对 Node 实例的指针的引用,而不是 Node* ,后者只是指向 Node 实例的指针。在第一种情况下,指针的值通过引用传递,并且可以在函数中更改。在第二种情况下,您只能更改 Node 实例。如果您想修改调用者传递给函数的指针,您需要第一个声明。 (2认同)

小智 11

最简单的:

#include <iostream>
using namespace std;

class A {
   public:
     A( int x ) : n( x ){}
     void print() { cout << n << endl; }
   private:
     int n;
};

void func( A p ) {
   p.print();
}

int main () {
   A a;
   func ( a );
}
Run Code Online (Sandbox Code Playgroud)

当然,您可能应该使用引用来传递对象,但我怀疑您尚未使用它们.

  • 通过ref传递是C++的一个必要的怪癖,*需要*预先引入,即使用户还不了解它.特别是,OP希望*修改*类成员. (2认同)

X''*_*X'' 6

如果要传递类实例(对象),请使用

 void function(const MyClass& object){
   // do something with object  
 }
Run Code Online (Sandbox Code Playgroud)

要么

 void process(MyClass& object_to_be_changed){
   // change member variables  
 }
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想"传递"这个本身

template<class AnyClass>
void function_taking_class(){
   // use static functions of AnyClass
   AnyClass::count_instances();
   // or create an object of AnyClass and use it
   AnyClass object;
   object.member = value;
}
// call it as 
function_taking_class<MyClass>();
// or 
function_taking_class<MyStruct>();
Run Code Online (Sandbox Code Playgroud)

class MyClass{
  int member;
  //...
};
MyClass object1;
Run Code Online (Sandbox Code Playgroud)