类与对象:
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;
}