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

Posted

技术标签:

【中文标题】如何在 C++ 中使用类对象作为函数参数【英文标题】:How to use a class object in C++ as a function parameter 【发布时间】:2009-12-13 12:33:55 【问题描述】:

我不确定如何拥有一个接收类对象作为参数的函数。有什么帮助吗?下面是一个例子。

#include<iostream>

void function(class object); //prototype

void function(class tempObject)

   //do something with object
   //use or change member variables

基本上我只是对如何创建一个接收类对象作为其参数的函数感到困惑,然后在函数内部使用这些参数,例如tempObject.variable

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

【问题讨论】:

@Adrian 请不要发明新标签 - 太多了。 【参考方案1】:

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

例如

class ANewType

    // ... details
;

这定义了一个名为ANewType 的新类型,它是一个类类型。

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

void function(ANewType object);

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

如果要修改函数外部的对象,如函数体中的 cmets 所示,则需要通过引用(或指针)获取对象。例如

void function(ANewType& object); // object passed by reference

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

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

【讨论】:

不过,class 关键字并不是非法的,因为他使用它。以下是一个完全有效的 TU:void f(class foo);。如果 "foo" 还不知道,它将在那里被引入,所以它是一个不常见的地方的前向声明。 @litb:100% 正确,但对于初学者来说可能比帮助更令人困惑。我有一些 C++ 经验,但如果我在野外遇到void f(class foo);,我会做双倍或三倍。 完美,感谢您的详细解释。非常感谢! 我不是 C++ 程序员,但这个话题很有趣,在***的一个例子中我看到了这个:void insert(Node*& root, int data)它的意思是?传递对指向 Node 类型对象的指针的引用。 void insert(Node* root, int data) 实际上不是同一个声明吗?如果有的话,两者有什么区别?【参考方案2】:

如果你想传递类instances(对象),你可以使用

 void function(const MyClass& object)
   // do something with object  
 

 void process(MyClass& object_to_be_changed)
   // change member variables  
 

另一方面,如果你想“传递”本身

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>();

class MyClass
  int member;
  //...
;
MyClass object1;

【讨论】:

【参考方案3】:

最简单的:

#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 );

当然,您可能应该使用引用来传递对象,但我怀疑您还没有接触到它们。

【讨论】:

传递 ref 是 C++ 的一个必要的怪癖,需要提前介绍,即使用户还不了解它。特别是,OP 想要修改类成员。 如果他不了解如何进行简单的函数调用,我认为引入引用是个坏主意。而如果他想改变类的内容,他还需要了解 private & public 和 constness。 在创建对象时必须传递一些值,如 A a(4);例如,在第 3 行中。【参考方案4】:

我也是这么问的。另一个解决方案是你可以重载你的方法:

void remove_id(EmployeeClass);
void remove_id(ProductClass);
void remove_id(DepartmentClass);

在调用中,参数将相应地适合您传递的对象。但是你将不得不重复自己

void remove_id(EmployeeClass _obj) 
    int saveId = _obj->id;
    ...
;

void remove_id(ProductClass _obj) 
    int saveId = _obj->id;
    ...
;

void remove_id(DepartmentClass _obj) 
    int saveId = _obj->id;
    ...
;

【讨论】:

【参考方案5】:

神圣的错误 下面代码的原因是为了说明如何不使每个函数都 void main 并且不键入 return;对于函数......而不是将所有东西都推入沉积物中,这是打印函数原型......如果你需要使用有用的函数......你将不得不在下面...... (p.s. 下面的内容适用于被这些对象和 T 模板淹没的人,它们允许不同的变量声明类型(例如 float 和 char)在用户定义的函数中使用相同的按值传递)

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

谁能告诉我为什么 c++ 使数组一次按值传递,而消除空格和标点符号的唯一方法是使用字符串标记。当我试图删除回文空格时,我无法解决这个问题......

#include <iostream>
#include <iomanip>
using namespace std;
int getgrades(float[]);
int getaverage(float[], float);
int calculateletters(float[], float, float, float[]);
int printResults(float[], float, float, float[]);


int main()


int i;
float  maxSize=3, size;
float  lettergrades[5], numericgrades[100], average;

size=getgrades(numericgrades);
average = getaverage(numericgrades, size);
printResults(numericgrades, size, average, lettergrades);
return 0;


int getgrades(float a[])
 


int i, max=3;

for (i = 0; i <max; i++)

    //ask use for input
    cout << "\nPlease Enter grade " << i+1 << " : ";
    cin >> a[i];
    //makes sure that user enters a vlue between 0 and 100

   if(a[i] < 0 || a[i] >100)
    
        cout << "Wrong input. Please
 enter a value between 0 and 100 only." << endl;
        cout << "\nPlease Reenter grade " << i+1 << " : ";
        cin >> a[i];

        return i;
    



int getaverage(float a[], float n) 
 
int i;
float sum = 0;
 if (n == 0)
return 0;
for (i = 0; i < n; i++)
sum += a[i];
return sum / n;
                               


int printResults(float a[], float n, float average, float letters[]) 

int i;
cout << "Index Number | input  |
array values address in memory " << endl;

for (i = 0; i < 3; i++)

cout <<"     "<< i<<" \t\t"<<setprecision(3)<<
a[i]<<"\t\t" << &a[i] << endl;

cout<<"The average of your grades is: "<<setprecision(3)<<average<<endl;


【讨论】:

欢迎来到 Stack Overflow!尽管此代码可能有助于解决问题,但它并没有解释 why 和/或 如何 回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。

以上是关于如何在 C++ 中使用类对象作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章

C++:如何将变量作为参数传递给类构造函数

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

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

C++基础之类和对象二

c++,类的对象作为形参时一定会调用复制构造函数吗?

如何使用 swig 将 python 类实例作为 c++ 函数的参数传递?