malloc和free new和delete的区别
相同点:从堆上申请空间,需要手动释放
不同点:malloc和free是函数,new和delete是操作符
malloc申请空间不会初始化,new申请空间会初始化
malloc要计算空间大小并传递,new只需要跟空间类型,若为多个对象在[]中指定对象个数
malloc返回值为void*使用时必须强转,new不需要因为new后跟空间类型
malloc申请空间失败时返回NULL需判定,new会抛异常要try catch
定位new表达式
int main()
{
A* p=new A(1);
A *p2=(A*)operator new(sizeof(A))
new(p2)A(1)
return 0;
}
模版初阶
template <class T>//模版参数列表<classT1,class T2......>
void Swap(T& a,T& b)
{
T tmp=a;
a=b;
b=tmp;
}
template <class T1, class T2>
void fun(const T1& a, const T2& e)//传两个类型不同的参数
{
}
template <class T>//模版参数列表<classT1,class T2......>
T Add(const T& left,const T& right)
{
return left + right;
}
int main()
{
int x = 2, y = 4;
double c = 3.4, d = 5.1;
Swap(x, y);
fun(x, c);
//推导实例化
cout <<Add((double)x, c) << endl;
//显示实例化
cout << Add<double>(x, c) << endl;
return 0;
}
类模板
template <class T1,class T2,...class Tn>
class
{
};
template <class T>
class Stack
{
T* arry;
int _size;
int _capacity;
public:
Stack(int n=4):arry(new T[n]),_size(0),_capacity(n){}
~Stack()
{
delete[] arry;
arry = nullptr;
_size = _capacity = 0;
}
void push(const T& a)
{
if (_size == _capacity)
{
T* tmp = new T[_capacity * 2];
memcpy(tmp, arry, sizeof(T) * _size);
delete[] arry;
arry = tmp;
_capacity *= 2;
}
_arry[size++] = x;
}
};
int main()//类模板都是显示实例化
{
Stack<int> st1;
st1.push(1);
st1.push(2);
st1.push(3);
Stack<double> st2;
st2.push(1.1);
st2.push(3.3);
st2.push(2.2);
Stack<double>* pst = new Stack<double>;
}
STL
string(管理字符串的类)
int main()
{
string s1;//分别是无参,有参,拷贝构造
string s2("hello world");
string s3(s2);
cout << s2 << s3 << endl;
string s4(s2, 6, 15);//从第6个字符开始拷贝拷5个字符
cout << s4 << endl;//若要考的多于source,则只考到结束
string s4(s2, 6);//不传也考到结束
string s5("hello world", 5);//用hello world的前5个字符初始化s5
cout << s5 << endl;
s2[2] = 'x';//operator[]重载使其可以像数组使用
}