我正在从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
答案 0 :(得分:1)
C ++不允许按值传递内置C风格的数组。可以通过引用传递数组或将指针传递给数组的第一个元素。给定这样的指针,可以访问整个数组。
指针传递不是文献中常用的术语,但是人们一次又一次地创造出类似的术语,这显示出某种真正的需要。这个术语背后的想法如下:一个按值传递指针,但目标是让函数作为左值访问指向的对象(通常通过引用传递该对象来实现)。
答案 1 :(得分:0)
这仅仅是因为你想要给setGrades一个数组,因为你想要设置数组的所有SIZE值&#39; grade&#39;。
正如您所知,数组的名称可以像指向该数组的第一个值的指针一样使用。 例如,您可以将* arrayInt写为等于arrayInt [0]的术语。
因此,当您将指向数组的第一个元素的指针传递给setGrades时,该函数可以使用arrayName [i]获取该数组的其他元素,其中i介于0和SIZE之间。
答案 2 :(得分:0)
您想将数组传递给setGrades
,您也可以这样定义:
void StudentRecord<T>::setGrades(T input[])
然而,编译器会自动将其转换为T*
指针。
函数将始终为编译期间提供的所有参数创建自己的副本(请参阅:call by value)。就在这里它是一个数组,但编译器不能立即将数组分配给另一个数组。进行数组赋值的唯一方法是逐个分配它的元素(或复制数组的整个内存块),编译器不会这样做。如果有一个类型为T
的指针指向数组的第一个元素,编译器确实知道你可以访问整个数组。它是传递整个数组的另一种方式。
这是将数组传递给函数的最常用方法。