【每日 C/C++ 问题】
一、 解释一下拷贝构造函数和赋值运算符重载的作用
拷贝构造函数是使用一个已经创建完毕的对象来初始化一个新对象。值传递的方式给函数传值也会调用拷贝构造(值传递是拷贝出一个临时的副本),以值方式返回局部对象也会调用拷贝构造,引用的方式不会启用拷贝构造。
赋值运算符重载是用于给已经存在的对象赋值的。
默认生成的拷贝构造和赋值运算符都会产生同一块内存被释放两次的问题,在用法上拷贝构造是创建新的对象,而赋值运算符是给已经存在的对象赋值,在实现上因为赋值运算符是给已经存在的对象重新赋值所以需要检查原对象是否指向堆区内存,如果指向堆区需要释放。
二、什么是c++模板,有哪些类型的模板
模板(template)是 C++ 的一种特性,允许函数或者类(对象)通过泛型(generic types)的形式表现或者运行模板可以使得函数或类在对应不同的类型(types)的时候正常工作,而无需为每一种类型分别写一份代码。
C++ 有两种类型的模板
template <typename T> int compare (T t1, T t2); // 声明模板函数 compare
template <typename T> class compare; // 声明模板类 compare
1:函数模板(function tempalte):使用泛型参数的函数(function with generic parameters)
// 定义一个模板函数
template <typename T>
int compare(T & t1, T & t2)
{
if (t1 > t2)
return 1;
if (t1 == t2)
return 0;
if (t1 < t2)
return -1;
}
2:类模板(class template):使用泛型参数的类(class with generic parameters)
#include<iostream>
using namespace std;
#include<vector>
// 并未引入stack头文件
template <typename T>
class stack
{
private:
vector<T> vec;
public:
void pop() {
vec.pop_back();
}
T top()
{
return vec.back();
}
bool empty() {
return vec.size() == 0 ? 1 : 0;
}
void push(T num)
{
vec.push_back(num);
}
};
int main() {
stack<int> stk;
stk.push(1);
stk.push(2);
stk.push(3);
stk.push(4);
while (!stk.empty())
{
cout << stk.top() << endl;
stk.pop();
}
return 0;
}
输出
4
3
2
1
原文地址:https://blog.csdn.net/2301_80313293/article/details/143524686
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!