有2个错误: (1)动态分配类类型数组时未有分配大小; stu = new student[]; -》stu = new student[2]; (2)student::student() { int num = 100; } 这个构造函数将num定义为局部变量,覆盖了成员那个num,成员那个num并未初始化;
C/C++ code
#include <iostream>usingnamespace std;
//类声明: class student
{
private:
int num;
public:
student();
~student();
int getnum();
};
//成员函数实现: student::student()
{
num =100;
}
int student::getnum()
{
return num;
}
student::~student(){}
//主函数: int main()
{
student *stu;
stu =new student[2];
cout << stu->getnum() <<endl;
return0;
}
#include <iostream> using namespace std; //#include"student.h" //类声明: class student { private: int num; public: student(); student(int); ~student(); int getnum();
刚才按照lzr4304061988012的做法,把对象数组的元素个数赋值stu = new student[2]也可以输出100了。 我就很奇怪,因为我原来是用while循环动态创建对象数组,相当于每循环一次创建一个对象,但运行不了。而这样赋值以后就可以运行了。为什么对象数组元素个数赋初值以后(赋值为1也可以),构造函数就可以将每个对象初始化了?这样就不是野指针了,不明白。
你对构造函数不够了解,基础太差了!你要知道对象的生灭,构造函数是用来创建对象的,既然对象已经创建那么构造函数肯定被执行了,也就是先调用构造函数才能创建对象的;只要你执行了这个语句student *stu; stu = new student[12];动态分配数组对象是要指定大小,其次这是已经产生了12个对象指针,他调用了12次构造函数,这不是野指针,他有自己的地址,他也不会造成非法访问;
你对构造函数不够了解,基础太差了!你要知道对象的生灭,构造函数是用来创建对象的,既然对象已经创建那么构造函数肯定被执行了,也就是先调用构造函数才能创建对象的;只要你执行了这个语句student *stu; stu = new student[12];动态分配数组对象是要指定大小,其次这是已经产生了12个对象指针,他调用了12次构造函数,这不是野指针,他有自己的地址,他也不会造成非法访问;
你还没明白我的意思。如果我执行student *stu; stu = new student[];就如六楼所说: 《因为你只是声明了*stu,并没有初始化它,初始化一个类的对象只能通过调用构造函数,stu本身是个指针,我们没有给指针提供的默认构造函数和自写的构造函数,这样你只是返回申请的指针的地址,但它指向不明,是个野指针,会返回垃圾数据,所以会输出-33606819》 我也知道,既然student *stu; stu = new student[2];可以执行,那就一定是构造函数对他初始化了。 我不明白的是为什么赋初值的情况下对象数组就有了自己的地址,尽管我知道这是一个事实。