this指针
如下有一个成员函数:
int getK() const
{
this->m_k = 100; //this指针不是Test const*型指针,但函数名尾部出现const时出错
this++; //error,因为this指针是一个常指针,Test *const
return this->m_k;
}
如果成员函数尾部出现const时,修饰this指针
静态成员函数
- 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。
静态成员函数只能访问静态数据成员。
原因:非静态成员函数,在调用时this指针被当做参数进行。而静态成员函数属于类,而不属于对象,没有this指针。
友元函数
当在类的外边定义一个函数,这个函数要使用类的私有成员,那么就要在类的public下用以下的方式声明此函数,让这个函数成为类的友元函数。
friend double test(类名 &对象);
友元类
在类B的成员函数中要使用类A的私有成员,那么在类A的public下就要声明类B为类A的友元类。
class A
{
public:
A(int a)
{
this->a = a;
}
friend class B;
private:
int a;
};
class B
{
public:
B(int b)
{
this->b = b;
}
void PrintA()
{
A objA(10);
cout << objA.a << endl;
}
private:
int b;
};
- 注意:
- 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类B中是否有类A的相应声明。
- 友元关系不能被继承。
- 友元关系不具有传递性。
操作符重载
背景:C++编译器对普通变量的加法运算你可以识别,但是如果我们自定义俩对象相加,编译器就不能识别了。
* 注意:操作符重载写全局时,在类中要用友元声明(“operator+”构成一个函数名)
举例:(实现复数相加)
下面这段函数实现了加法的操作符重载。
Plural operator+(Plural &c1,Plural &c2)
{
return Plural temp(c1.a+c2.a,c1.b+c2.b);
}
利用上面这段函数实现完整的俩对象相加:
#include "stdafx.h"
using namespace std;
class Plural
{
public:
Plural(int a, int b)
{
this->a = a;
this->b = b;
}
friend Plural operator+(Plural &c1, Plural &c2);
void Printplural()
{
cout << "(" << this->a << ", " << this->b << "i)" << endl;
}
private:
int a;
int b;
};
Plural operator+(Plural &c1, Plural &c2)
{
Plural temp(c1.a + c2.a, c1.b + c2.b);
return temp;
}
int main()
{
Plural p1(1, 2);
Plural p2(3, 4);
p1.Printplural();
p2.Printplural();
Plural p3 = p1 + p2; //等于p3 = operator+(p1,p2);
p3.Printplural();
return 0;
}