C++模板特化|构造函数的三种实现方式|左值引用和右值引用|移动构造函数|运算符重载|移动赋值
//1 括号法,常用
Person p1(10);
//注意1:调用无参构造函数不能加括号,如果加了编译器认为这是一个函数声明
//Person p2();//2 显式法
Person p2 = Person(10);
Person p3 = Person(p2);
//Person(10)单独写就是匿名对象 当前行结束之后,马上析构//3 隐式转换法
Person p4 = 10; // Person p4 = Person(10); //不是赋值操作!!!!!
Person p5 = p4; // Person p5 = Person(p4); //不是赋值操作!!!!!//注意2:不能利用 拷贝构造函数 初始化匿名对象 编译器认为是对象声明
//Person p5(p4);
类似于函数的默认参数,模板特化是把类型默认了。
语法:类名<'默认类型',T> 例如 class Boss
模板特化由全特化和部分特化组成。其中偏特化是指默认部分参数,而全特化则指默认全部参数。
注意:运算符重载为全局函数时,参数的个数等于运算符的目数(即操作数的个数);运算符重载为成员函数时,参数的个数等于运算符的目数减一。
'+"/'-'运算符:
//成员函数实现 + 号运算符重载
Person operator+(const Person& p)
{
Person temp;
temp.m_A = this->m_A + p.m_A;
temp.m_B = this->m_B + p.m_B;
return temp;
}
左移运算符:
ostream& operator<<(ostream& out, Person& p)
{
out << "a:" << p.m_A << " b:" << p.m_B;
return out;
}
递增运算符
//前置++
MyInteger& operator++()
{
//先++
m_Num++;
//再返回
return *this;
}
//后置++
MyInteger operator++(int)
{
//先返回
MyInteger temp = *this; //记录当前本身的值,然后让本身的值加1,但是返回的是以前的值,达到先返回后++;
m_Num++;
return temp;
}
赋值运算符:
//重载赋值运算符
Person& operator=(Person &p)
{
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
//编译器提供的代码是浅拷贝
//m_Age = p.m_Age;
//提供深拷贝 解决浅拷贝的问题
m_Age = new int(*p.m_Age);
//返回自身
return *this;
}
关系运算符:
bool operator==(Person & p)
{
if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
{
return true;
}
else
{
return false;
}
}
bool operator!=(Person & p)
{
if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
{
return false;
}
else
{
return true;
}
}
函数调用运算符(仿函数):
void operator()(string text)
{
cout << text << endl;
}