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

时间:2009-12-13 12:33:56

标签: c++ parameters

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

#include<iostream>

void function(class object); //prototype

void function(class tempObject)
{
   //do something with object
   //use or change member variables
}

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

很抱歉,如果这有点令人困惑,我对C ++相对较新。

5 个答案:

答案 0 :(得分:35)

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

e.g。

class ANewType
{
    // ... details
};

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

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

void function(ANewType object);

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

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

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

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

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

答案 1 :(得分: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 );
}

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

答案 2 :(得分:6)

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

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

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

另一方面,如果你想&#34;通过&#34; 本身

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 :(得分:0)

我也在问同样的问题。另一个解决方案是您可以重载方法:

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;
    ...
};

答案 4 :(得分:-1)

神圣错误下面代码的原因是为了说明如何不对主要的每个函数进行void而不是键入return;对于功能......而是将所有东西都推入沉积物中,这是打印功能的原型......如果你需要使用有用的功能......你将不得不...... (ps下面是针对那些被这些对象和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;

}