构造函数执行完后,成员变量的赋值消失了?!
//vector.h#ifndef _VECTOR_H_
#define _VECTOR_H_
#include<iostream>
using namespace std;
typedef int Rank;
#define DEFAULT_CAPACITY 10
class Vector
{
private:
int *p,*elem;//p指向数组elem,用于释放数组
int _capacity;//_capacity是数组容量
void swap(int &i,int &j);//交换
bool bubble(Rank lo,Rank hi);//一趟扫描交换
public:
Rank _size;//_size是实际规模
void expand();//空间不足时扩容
void shrink();//缩容
Rank insert(Rank r,int const & e);//插入
int remove(Rank lo,Rank hi);//删除区间
void unsort(Rank lo,Rank hi);//随机打乱原有向量顺序
Rank find(int const& e,Rank lo,Rank hi)const;//无序向量的顺序查找:返回最后一个元素e的位置;失败时,返回lo-1
void traverse();//遍历
void bubbleSort(Rank lo,Rank hi);//冒泡排序法
void print();
//构造函数
Vector(int _capacity=DEFAULT_CAPACITY,int scale=7);//c是数组容量,scale是实际规模
~Vector()//析构函数,释放elem数组
{
cout << "已释放" << _capacity << "个单位的数组" << endl;
delete [] p;
}
};
#endif //main.cpp
#include "vector.h"
#include <iostream>
using namespace std;
int main()
{
Vector v1;
v1.expand();//空间不足时扩容
cout << v1._capacity << endl;
v1.find('e',0,v1._size);//无序向量的顺序查找:返回最后一个元素e的位置;失败时,返回lo-1
v1.traverse();//遍历
v1.bubbleSort(0,v1._size);//冒泡排序法
return 0;
} //vector.cpp
#include "vector.h"
#include <iostream>
using namespace std;
Vector::Vector(int _capacity,int scale)
{
cout << "请输入向量的容量:";
cin >> _capacity;
cout << "请输入向量的实际规模:";
cin >> scale;
elem = new int;//建立容量为_capacity的数组
cout << "请输入向量的元素(用回车隔开):";
for(_size = 0;_size < scale;cin >> elem) //给数组中的前scale个赋值
p = elem;
cout << "已创建" << _capacity << "个单位的数组" << endl;
}
void Vector::expand()//空间不足时扩容
{
if(_size < _capacity)//尚未满员时,不必扩容
return;
int * oldElem = elem;
elem = new int;//容量加倍
// cout << _capacity << endl;
for(int i= 0;i < _size;i++)
elem = oldElem;//复制原向量内容
delete []oldElem;//释放原空间
cout << "该向量扩容后容量为:" << _capacity << endl;
print();
}
//后面的其他函数就不放了,无关紧要 通过断点调试,我发现,在执行构造函数的最后一句输出_capacity的时候,还是正常的,即我输入的值。但当构造函数结束了,在main里执行下一步时,_capacity变成了一个垃圾值(-1717986920),导致后面的扩容出错。
请问大佬们,怎么会这样……_capacity明明是成员函数啊! 本帖最后由 xieglt 于 2020-11-19 07:45 编辑
class Vector
{
private:
int *p,*elem;//p指向数组elem,用于释放数组
int _capacity;//_capacity是数组容量
}
Vector::Vector(int _capacity,int scale);
成员变量和构造函数的参数用的一个名字。编译器怎么区分呢?
实际上,编译器使用的是参数,你的成员变量没赋值,当然是一个乱数字啦。
扩容函数也有一个问题。没有给 p 赋值,
p还是指向 oldelem。如果在其他函数里用到p,肯定会出错。 xieglt 发表于 2020-11-19 07:41
成员变量和构造函数的参数用的一个名字。编译器怎么区分呢?
实际上,编译器使用的是参数,你的成员变量 ...
感谢你!我以为在类里函数使用成员变量是默认的……解决了!
不过p指针我指向的是elem数组?特地设置p指针是为了析构函数里delete [] p;
页:
[1]