C++结构体传参问题
C++的结构体传参可以有三种方式:
- 传递结构体变量,值传递;
- 传递结构体指针,地址传递;
- 传递结构体成员,可是值传递也可以是地址传递。
1. 传递结构体变量:值传递
#include<iostream>
#define COMMANDLENGTH 100
using std::cout;
using std::endl;
// 注意C和C++中struct和typedef struct有区别。
struct Message{
int oneField;
short twoField;
char command[COMMANDLENGTH];
}message;
// C++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
class NewMessage{
private:
//一般用来声明变量
public:
Message Deliver(Message stu); // 让函数的返回值也是结构体,传递结构体变量
};
void main()
{
NewMessage newMessage; // 创建类对象
Message tempMessage, recvMessage;24
tempMessage.oneField = 5;
tempMessage.twoField = 10;
recvMessage = newMessage.Deliver(tempMessage);// recvMessage用来接收函数的返回值
cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
system("pause");
}
inline Message NewMessage::Deliver(Message stu)
{
Message temp;
temp = stu;
temp.oneField = 10;
temp.twoField = 20;
return temp;
}
补充:函数的执行结果会将结构体的变量值成功修改!
2. 传递结构体指针:地址传递
#include<iostream>
#define COMMANDLENGTH 100
using std::cout;
using std::endl;
// 注意C和C++中struct和typedef struct有区别。
struct Message{
int oneField;
short twoField;
char command[COMMANDLENGTH];
}message;
// C++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
class NewMessage{
private:
//一般用来声明变量
public:
Message Deliver(Message *stu);//我让函数的返回值也是结构体,地址传递
};
void main()
{
NewMessage newMessage;//创建类对象
Message *tempMessage = &message;//定义Message的指针变量指向message,也就是结构体的地址
Message recvMessage;
tempMessage->oneField = 5;
tempMessage->twoField = 10;
recvMessage = newMessage.Deliver(tempMessage);//传递的是结构体的指针地址
cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
system("pause");
}
inline Message NewMessage::Deliver(Message *stu)
{
Message temp;
temp = *stu;
temp.oneField = 10;
temp.twoField = 20;
return temp;
}
补充:函数的执行结果会将结构体的变量值成功修改!
注意:把一个完整的结构体变量作为参数传递,要将全部成员值一个一个传递,费时间又费空间,开销大。如果结构体类型中的成员很多,或有一些成员是数组,则程序运行效率会大大降低。在这种情况下,用指针做函数参数比较好,能提高运行效率。
3. 传递结构体成员:值传递或地址传递
这种情况就是结构体内部的成员变量作为参数传递,可以使值传递,可以是地址传递。
#include<iostream>
#define COMMANDLENGTH 100
using std::cout;
using std::endl;
//注意 c和C++中struct和typedef struct有区别。
struct Message{
int oneField;
short twoField;
char command[COMMANDLENGTH];
}message;
//C++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
class NewMessage{
private:
//一般用来声明变量
public:
int Deliver(int onefield, int twofield);
};
void main()
{
NewMessage newMessage;//创建类对象
Message *valueMessage = &message;//定义Message的指针变量指向message,也就是结构体的地址
Message addrMessage;
int sum;
//值传递
/*
addrMessage.oneField = 5;
addrMessage.twoField = 10;
sum = newMessage.Deliver(addrMessage.oneField, addrMessage.twoField);
*/
//指针地址传递,引用
valueMessage->oneField = 5;
valueMessage->twoField = 10;
sum = newMessage.Deliver(valueMessage->oneField, valueMessage->twoField);
cout << sum<<endl;
system("pause");
}
inline int NewMessage::Deliver(int onefield, int twofield)
{
int a = onefield;
int b = twofield;
return a + b;
}