2021SC@SDUSC
目录
1.友元函数
私有成员对于类外部的所有程序部分而言都是隐藏的,访问它们需要调用一个公共成员函数,但有时也可能会需要创建该规则的一项例外。
友元函数是一个不属于类成员的函数,但它可以访问该类的私有成员。换句话说,友元函数被视为好像是该类的一个成员。友元函数可以是常规的独立函数,也可以是其他类的成员。实际上,整个类都可以声明为另一个类的友元。
为了使一个函数或类成为另一个类的友元,必须由授予它访问权限的类来声明。类保留了它们的朋友的 "名单",只有名字出现在列表中的外部函数或类才被授予访问权限。通过将关键字 friend 放置在函数的原型之前,即可将函数声明为友元。
2.类的指针
(1)他是一个内存地址值,他指向内存中存放的类对象 (包括一些成员变量所赋的值,类指针可以指向多个不同的对象,这就是多态);
(2)指针用“->”操作符;
(3)储存位置:用的是内存堆,是个永久变量,除非你释放它;
(4)什么情况使用类对象与类指针?
——其实作用基本一样 都是为了调用类的成员变量和成员函数用的;
——当你希望明确使用这个类的时候,最好使用对象;
如果你希望使用C++中的动态绑定,则最好使用指针或者引用,指针和引用用起来更灵活,容易实现多态等。
(5)指针好处
——第一,实现多态。
——第二,在函数调用,传指针参数。不管你的对象或结构参数多么庞大,你用指针,传过去的就是4个字节。如果用对象,参数 传递占用的资源就太大了。
3.作用域符号::
作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分
如:A,B表示两个类,在A,B中都有成员member。那么
A::member就表示类A中的成员member
B::member就表示类B中的成员member
4.C++11新特性:std::move()和std::forward()
C++11通过std::move()和std::forward()函数分别实现了左值转右值和完美转发的功能。
std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。
friend class ProtocolWrapper;
};
定义友元类ProtocolWrapper
class ProtocolWrapper : public ProtocolMessage
{
类ProtocolWrapper继承了公有类ProtocolMessage;
protected:
virtual int encode(struct iovec vectors[], int max)
{
return this->msg->encode(vectors, max);
}
定义序列化函数encode
virtual int append(const void *buf, size_t *size)
{
return this->msg->append(buf, size);
}
定义反序列化函数append
protected:
ProtocolMessage *msg;
public:
ProtocolWrapper(ProtocolMessage *msg)
{
msg->wrapper = this;
this->msg = msg;
}
定义了公有类ProtocolMessage的指针,作为友元类ProtocolWrapper的参数,指向ProtocolWrapper;
public:
ProtocolWrapper(ProtocolWrapper&& wrapper) :
ProtocolMessage(std::move(wrapper))
{
wrapper.msg->wrapper = this;
this->msg = wrapper.msg;
wrapper.msg = NULL;
}
std::move把参数wrapper的左值转右值;
ProtocolWrapper& operator = (ProtocolWrapper&& wrapper)
{
重载赋值运算符;
if (&wrapper != this)
{
*(ProtocolMessage *)this = std::move(wrapper);
wrapper.msg->wrapper = this;
this->msg = wrapper.msg;
wrapper.msg = NULL;
}
设置初始的wrapper.msg下一个为空。
return *this;
}
};
}
#endif
-------------------------------------------------------------------------------------------------
参考资料: