C++ C++;在类中初始化时
我试图创建一个名为Player的类,它有一个名为scores的数组,在Player类属性中声明了一个大小。然而,当我初始化一个新玩家时,sizeof(scores)方法会给我20,事实上,它会初始化一个大小为20而不是5的分数数组。我想知道为什么以及如何解决这个问题。下面是代码和输出C++ C++;在类中初始化时,c++,arrays,class,c9.io,C++,Arrays,Class,C9.io,我试图创建一个名为Player的类,它有一个名为scores的数组,在Player类属性中声明了一个大小。然而,当我初始化一个新玩家时,sizeof(scores)方法会给我20,事实上,它会初始化一个大小为20而不是5的分数数组。我想知道为什么以及如何解决这个问题。下面是代码和输出 #include <iostream> #include <iomanip> #include <sstream> using namespac
#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;
struct stats {
unsigned int min;
unsigned int max;
unsigned int mode;
unsigned int modeFreq;
unsigned int mean;
unsigned int total;
};
class Player {
public:
int scores[5];
stats pStats;
void inputScores();
void calculateStats();
void printScores();
};
void Player::printScores(){
cout << "Printing Scores..." << endl;
for (int i = 0; i < sizeof(scores); i++) {
cout << scores[i] << endl;
}
}
void Player::inputScores(){
for (int i = 0; i < sizeof(scores); i++) {
cout << "Enter a score for [" << i << "]: ";
int input;
cin >> input;
scores[i] = input;
}
}
int main() {
Player p;
cout << sizeof(p.scores);
p.inputScores();
p.printScores();
}
因此,最多20…sizeof(scores)
是scores
对象的字节大小,即5*sizeof(int)
。在流行的平台上生产20台。因此,您正在从0迭代到19,并访问不存在的数组元素
您观察到的奇怪输出只不过是由越界数组访问导致的未定义行为的一种表现
那么,为什么要使用sizeof(scores)
作为数组大小呢
有一种基于sizeof
的技术可以确定数组大小,但它涉及将整个数组的字节大小除以单个元素的字节大小
sizeof scores / sizeof *scores
请记住,它只适用于数组类型的对象(不适用于指针)
P>可选的,在现代C++中,可以使用< /P>
std::extent<decltype(scores)>::value
std::extent::value
确定数组大小。sizeof(scores)
是scores
对象的字节大小,即5*sizeof(int)
。在流行的平台上生产20台。因此,您正在从0迭代到19,并访问不存在的数组元素
您观察到的奇怪输出只不过是由越界数组访问导致的未定义行为的一种表现
那么,为什么要使用sizeof(scores)
作为数组大小呢
有一种基于sizeof
的技术可以确定数组大小,但它涉及将整个数组的字节大小除以单个元素的字节大小
sizeof scores / sizeof *scores
请记住,它只适用于数组类型的对象(不适用于指针)
P>可选的,在现代C++中,可以使用< /P>
std::extent<decltype(scores)>::value
std::extent::value
要确定数组大小。或者,使用
std::array
,它有一个size
成员函数。:-)谢谢你的建议。为了方便起见,我简单地将所有出现的“sizeof(scores)”替换为“(sizeof(scores)/sizeof(*scores)”,效果很好。或者,使用std::array
,它有一个size
成员函数。:-)我感谢您的建议。为了简单起见,我简单地将所有出现的“sizeof(scores)”替换为“(sizeof(scores)/sizeof(*scores)”,效果很好。