20161228C++阶段班03_Object C++_02类与对象/MyArray类

类与对象:

1:在类里面,类内部每次传入参数的时候应该把参数设成const属性,保证类内部不改变外面的值。每次在给指针重新new数组之前应该把这个指针原来指向的内存空间删除。防止内存泄漏。不然后面废弃的内存会越来越多。软件就不能持续长时间运行。软件在退出结束的时候,系统会将原来使用过的内存全部释放(一般不长期运行的程序很少的泄漏是没有问题的,但是如果需要长时间运行的程序就一定要注意释放内存。养成好的变成习惯。)。

char *setString(const char *str)
{
  _len = strlen(str);
  delete[]_str;//一定要删除原来的(除非后面还有用)。
  _str = new char[_len + sizeof(char)];//长度要加一个'\0'
  strcpy(_str,str);
  return _str;
}

2:字符串操作永远是拿着首地址在操作。一定要注意申请的空间够不够,不能把数据写到空间外。

3:类,体现的是封装属性。使用的时候直接拿着用,比较容易。

MyArray类:可变长的数组。现在的数组一般是不可变长的数组。每次使用需要遍历一遍,很复杂麻烦。

1:类里面的数据一般做成private,这样比较安全。类的设计一般参照银行,提高安全性。

2:new的数据为数组,delete的时候一定要加[],才能删除干净。

3:类里面的参数如果默认为0,nullptr等,如果申请类成员的时候又没有给值,后面的对象的操作就很可能出错。因为可能对空指针进行操作。但析构函数删除的时候一定要判断,不能对空指针操作(有的编译器可能会出错)。参数默认最好不要为0和nullptr。

4:C++中:new/delete:要数组长度可变的话,必须new一块足够的空间,然后copy,然后delete原来的空间。C语言中:malloc/free/relloc:更改长度可以直接用relloc就可以了(等于重新申请)。这两个方法是有区别的,那个更合适就用那个。

5:size_t/std::size_t;两种风格的size_t,前者是C语言的,后者是C++标准库的(#include "iostream")。

int &Index(const std::size_t index)
{
  if(index<_len)
    return _data[index];
  else
}

6:调用这个函数的时候首先要确定类里面私有的数据_data[];必须不为空指针。而且index不能越界,越界就因该抛出异常。所以一般会把这个分成两个方法(get和set)。
7:在类内部可以直接访问外部传入的这个类的一个成员的所有变量,调用所有方法,如果传进来的时候加了const,那么就只能访问变量和const的方法了。
8:this指针:每一个对象里面的隐藏属性。每一个对象都会有一个this指针。在类内部使用this相当于就是这个类本身,this指针和类没有关系。this指针就是来区分不同的对象,实际上this指针指向这个类对象的开头指针(前面保存的是变量,后面的是方法。)
9:方法也有const方法,在方法后面加const就是const方法,这样的方法可以被const的对象调用。而且const对象只能调用const方法,否则会报错
error C2662: “int MyArray::getData(const size_t)”: 不能将“this”指针从“const MyArray”转换为“MyArray &”。
如果把setData等函数改为const方法的话,const的对象也可以调用,也可以修改里面的值,这个方法本身就不应该为const方法,程序员也不应该把这种方法设置成const方法。类似于const,public,private等都是在编译器上做的功夫。是编译的时候检测错误。
10:类内部的方法可以互相调用。
#include <iostream>


class MyArray
{
public:
	MyArray(const std::size_t num = 4)
	{
		_len = num;
		_index = 0;
		_data = new int[_len];
	}
	~MyArray()
	{
		if (_data)
			delete[]_data;
	}
private:
	int *_data;
	unsigned int _len;//总长度
	unsigned int _index;//用了的长度

public:
	int getData(const std::size_t index) const
	{
		if (index <= _index)
			return _data[index];
		return 0;
	}
	void setData(const std::size_t index, const int num)const
	{
		if (_len >= index)
			_data[index] = num;
	}
	void addData(const int num)
	{
		if (_len <= _index)
		{
			_len = _index * 2;//每次超出分配原来两倍的空间
			int *temp = new int[_len];
			memcpy(temp, _data, _index * sizeof(int));
			delete[]_data;
			_data = temp;
		}
		_data[_index++] = num;
		//如果为++_index就会导致第一个空间没写,最后多写了一个数据,破坏了_data会导致上面delete失败,也可以提前一个把内存扩大两倍
	}
	void addData(const MyArray &data)
	{
		for (unsigned int i = 0; i < data._len; i++)
			this->addData(data.getData(i));
//		data.setData(0, 1000);//如果setData方法也是const类型,那么可以调用,而且可以修改成功
	}
	void addData(const int *data, const unsigned int len)//添加数组
	{
		for (int i = 0; i < len; i++)
			addData(data[i]);
	}
};

int main()
{
	MyArray array2(10);
	MyArray array1(10);
	array1.addData(1);
	array1.addData(2);
	array1.addData(3);
	array1.addData(4);
	array1.addData(5);
	array1.addData(6);
	array1.addData(7);
	array1.addData(8);
	array1.addData(9);
	array1.addData(10);
	array1.addData(11);
	array1.addData(12);
	array1.addData(13);
	array1.addData(14);
	array1.addData(15);
	array1.addData(16);
//	array1.addData(array2);
//	std::cout << array2.getData(0) << std::endl;
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值