我正在从course on Udacity学习C ++。
你能解释一下为什么setGrades()
被定义为一个指针传递到值的函数吗?为什么传递值会出错?在下面的代码中,我省略了printGrades()
和setID()
的定义。
#include<iostream>
using namespace std;
const int SIZE = 5;
template <class T>
class StudentRecord
{
private:
const int size = SIZE;
T grades[SIZE];
int studentId;
public:
StudentRecord(T defaultInput);
void setGrades(T* input);
void setId(int idIn);
void printGrades();
};
template<class T>
StudentRecord<T>::StudentRecord(T defaultInput)
{
for(int i=0; i<SIZE; ++i)
grades[i] = defaultInput;
}
template<class T>
void StudentRecord<T>::setGrades(T* input)
{
for(int i=0; i<SIZE;++i)
{
grades[i] = input[i];
}
}
int main()
{
StudentRecord<int> srInt(-1);
srInt.setId(111111);
int arrayInt[SIZE]={4,3,2,1,4};
srInt.setGrades(arrayInt);
srInt.printGrades();
return 0;
}
输出应该是:
ID# 111111: 4
3
2
1
4
C ++不允许按值传递内置C风格的数组。可以通过引用传递数组或将指针传递给数组的第一个元素。给定这样的指针,可以访问整个数组。
传递指针不是文献中的常用术语,但人们一次又一次地创造出类似的术语,这显示出某种真正的需要。该术语背后的想法如下:一个按值传递指针,但目标是让函数作为左值访问指向的对象(通常通过引用传递该对象来实现)。
这只是因为它是一个你想要给setGrades的数组,因为你想设置数组'grade'的所有SIZE值。
或许你知道,数组的名称可以像指向该数组的第一个值的指针一样使用。例如,您可以将* arrayInt写为等于arrayInt [0]的术语。
因此,当您将指针传递给数组的第一个元素以设置Grades时,该函数可以使用数组Name [in]获取该数组的其他元素,其中i介于0和SIZE之间。
您想将数组传递给setGrades
,您也可以像这样定义它:
void StudentRecord<T>::setGrades(T input[])
但是编译器会自动将其转换为T*
指针。
函数将始终为编译期间提供的所有参数创建自己的副本(请参阅:call by value)。就在这里它是一个数组,但编译器不能立即将数组分配给另一个数组。进行数组赋值的唯一方法是逐个分配其元素(或复制数组的整个内存块),编译器不会这样做。如果你有一个类型为T
的指针指向数组的第一个元素,编译器确实知道你可以访问整个数组。它是传递整个数组的另一种方式。
这是将数组传递给函数的最常用方法。