C++模板特化|构造函数的三种实现方式|运算符重载

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;也就是在类名后面加上要默认的类型参数。


模板特化由全特化和部分特化组成。其中偏特化是指默认部分参数,而全特化则指默认全部参数。

C++模板特化|构造函数的三种实现方式|运算符重载_第1张图片

注意:运算符重载为全局函数时,参数的个数等于运算符的目数(即操作数的个数);运算符重载为成员函数时,参数的个数等于运算符的目数减一。

运算符重载

'+"/'-'运算符:

//成员函数实现 + 号运算符重载
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;
}

你可能感兴趣的:(C++,c++)