创作过程中难免有不足,若您发现本文内容有误,恳请不吝赐教。
提示:以下是本篇文章正文内容,下面案例可供参考。
一、写一个简单的栈
#include<iostream>
using namespace std;
typedef char DataType;
class Stack
{
public:
Stack(size_t capacity = 4)
{
cout << "Stack()" << endl;
_array = new DataType[capacity];
_capacity = capacity;
_size = 0;
}
~Stack()
{
cout << "~Stack()" << endl;
delete[] _array;
_array = nullptr;
_size = _capacity = 0;
}
private:
// 内置类型
DataType* _array;
int _capacity;
int _size;
};
int main()
{
Stack st1;
return 0;
}
二、malloc/free和new/delete的区别
malloc/free和
new/delete
的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:
1. malloc
和
free
是函数,
new
和
delete
是操作符。
2. malloc
申请的空间不会初始化,
new
可以初始化。
3. malloc
申请空间时,需要手动计算空间大小并传递,
new
只需在其后跟上空间的类型即可,如果是多个对象,[]
中指定对象个数即可。
4. malloc
的返回值为
void*,
在使用时必须强转,
new
不需要,因为
new
后跟的是空间的类型。
5. malloc
申请空间失败时,返回的是
NULL
,因此使用时必须判空,
new
不需要,但是
new
需要捕获异常。
6.
申请自定义类型对象时,
malloc/free
只会开辟空间,不会调用构造函数与析构函数,而
new在申请空间后会调用构造函数完成对象的初始化,delete
在释放空间前会调用析构函数完成空间中资源的清理。
三、泛型编程
如何实现一个通用的交换函数呢?
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
四、函数模板
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定
类型版本。
#include<iostream>
using namespace std;
// 模板
// Type
//template<class T> 和 template<typename T> 两种形式
//template<typename T1, typename T2> 多类型
// 编译器用模板实例化生成对应的Swap函数
// 函数模板
template<class T>
void Swap(T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
int main()
{
int i = 0, j = 1;
Swap(i, j);
cout << i << " " << j << endl;
double x = 1.1, y = 2.2;
Swap(x, y);
cout << x << " " << y << endl;
return 0;
}
#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
int main()
{
cout << Add(1, 2) << endl;
//cout << Add(1.1, 2) << endl; 参数不匹配
cout << Add((int)1.1, 2) << endl;
cout << Add(1.1, (double)2) << endl;
// 显示实例化
cout << Add<int>(1.1, 2) << endl;
cout << Add<double>(1.1, 2) << endl;
return 0;
}
五、类模板
//上面的代码typedef不能解决同时创建两个int和doublel类型的栈
Stack st1; // int
Stack st2; // double
#include<iostream>
using namespace std;
template<class T>
class Stack
{
public:
Stack(size_t capacity = 4)
{
cout << "Stack()" << endl;
_array = new T[capacity];
_capacity = capacity;
_size = 0;
}
void Push(const T& data)
{
_array[_size] = data;
_size++;
}
~Stack()
{
cout << "~Stack()" << endl;
delete[] _array;
_array = nullptr;
_size = _capacity = 0;
}
private:
T* _array;
int _capacity;
int _size;
};
int main()
{
Stack<int> st1; // int
Stack<double> st2; // double
st1.Push(1);
st1.Push(2);
st2.Push(1.2);
st2.Push(1.2);
return 0;
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了c++基础知识。