哗啦哗啦啦啦啦 发表于 2020-11-19 01:13:13

构造函数执行完后,成员变量的赋值消失了?!

//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

哗啦哗啦啦啦啦 发表于 2020-11-19 01:14:25

//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;
}

哗啦哗啦啦啦啦 发表于 2020-11-19 01:15:12

//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();
}

//后面的其他函数就不放了,无关紧要

哗啦哗啦啦啦啦 发表于 2020-11-19 01:18:33

通过断点调试,我发现,在执行构造函数的最后一句输出_capacity的时候,还是正常的,即我输入的值。但当构造函数结束了,在main里执行下一步时,_capacity变成了一个垃圾值(-1717986920),导致后面的扩容出错。
请问大佬们,怎么会这样……_capacity明明是成员函数啊!

xieglt 发表于 2020-11-19 07:41:17

本帖最后由 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,肯定会出错。

哗啦哗啦啦啦啦 发表于 2020-11-19 10:29:39

xieglt 发表于 2020-11-19 07:41
成员变量和构造函数的参数用的一个名字。编译器怎么区分呢?
实际上,编译器使用的是参数,你的成员变量 ...

感谢你!我以为在类里函数使用成员变量是默认的……解决了!
不过p指针我指向的是elem数组?特地设置p指针是为了析构函数里delete [] p;
页: [1]
查看完整版本: 构造函数执行完后,成员变量的赋值消失了?!