不是一定要用引用。
由于对象一般都含有较多的数据成员,当其作为函数参数传递时,传递对象值的耗时要比传递对象地址耗时多,所以一般采用传递地址的方式。
使用指针也能传递地址,但C++引入了引用的概念之后,使用引用要比使用指针的可读性好些。
有时,一些函数(包括拷贝构造函数)参数要求用(不是必须用)常引用,目的是为了避免函数体中无意地修改指针所指对象的值。
可以说是对,在C++中,数组并不像java那样是对象,C++的数组就是一段内存,值传递,其实是指针传递
当然,C++那么牛B的,肯定支持数组的引用传递了
值传递:
void fun(int arr[]);
实际上传递的是数组的首地址指针;
引用:
void fun(int (&arr)[SIZE]);
注意,方括号中的SIZE必须要写,而且在调用的时候必须用这个SIZE的数组,否则会出错;
例如:
void fun(int (&arr)[5]);
在调用的时候传入的数组必须是int型的大小为5的数组:
int nArr[5];
fun(nArr);
否则会错;
更牛B的用法:
刚才说了,C++是很牛B的,那么牛B的,难道定义的函数只能处理固定大小的数组?当然不是
这样定义,可以处理任意大小的数组:
template < int N >
void fun(int (&arr)[N]);
这样,任意大小的int型数组都可以传递进来了
这个方法叫“非类型模版参数”
数组作为参数是按地址传递的 数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送, 也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为
void set(vector<student>&); //这个是对象吧?在函数中形式参数是可以省略
变量名的,
比如 void change(int &,in &);
#include <iostreamh>
#include <string>
using namespace std;
#define STUDENTNUM 5
class Student
{
public:
Student() {}
Student(double score, unsigned int num, string name);
double GetScore();
unsigned int GetNum();
private:
double m_dScore;
unsigned int m_iNum;
string m_strName;
};
Student::Student(double score, unsigned int num, string name)
{
m_dScore = score;
m_iNum = num;
m_strName = name;
}
double Student::GetScore()
{
return m_dScore;
}
unsigned int Student::GetNum()
{
return m_iNum;
}
unsigned int GetMaxScore(Student st)
{
int MaxScoreIndex = 0;
for(int i = 0; i < STUDENTNUM - 1; i++)
{
int Max = ((st + i)->GetScore()) > ((st + i + 1)->GetScore()) i : (i + 1);
MaxScoreIndex = ((st + MaxScoreIndex)->GetScore()) > ((st + Max)->GetScore()) MaxScoreIndex : Max;
}
return (st + MaxScoreIndex)->GetNum();
}
void main()
{
Student StuInfo[5];
StuInfo[0] = Student(100, 1, "zhangsan");
StuInfo[1] = Student(90, 2, "lisi");
StuInfo[2] = Student(80, 3, "lucy");
StuInfo[3] = Student(70, 4, "hanmeimei");
StuInfo[4] = Student(60, 5, "joey");
int Num = GetMaxScore(StuInfo);
cout<<Num<<endl;
}
粗略写了下,希望能看懂。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)