场景:一个类将复制构造函数和赋值运算符都设置为私有,那么这个时候怎么去创建使用这个类呢?
背景:在看RTTI(运行时转换)时看到的百度百科简介,如下面代码,type_info类的复制构造和赋值运算法都被设置为私有,用户没有办法直接创建使用这个类。
class type_info
{
private:
type_info(const type_info&);
type_info& operator=(const type_info&);//type_info类的复制构造函数和赋值运算符是私有的。
public:
virtual ~type_info();//析构函数
bool operator==(const type_info&)const;//在type_info类中重载了==运算符,该运算符可以比较两个对象的类型是否相等。
bool operator!=(const type_info&)const;//重载的!=运算符,以比较两个对象的类型是否不相等
const char* name()const;//使用得较多的成员函数name,该函数返回对象的类型的名字。前面使用的typeid(a).name()就调用了该成员函数
bool before(const type_info&);
};
但是通过函数typeid()就可以使用这个类。
那typeid函数怎样创建type_info类的对象?
友元函数
typeid()函数返回一个type_info类对象的引用,即形式为const type_info& typeid();
当typeid是type_info的友元函数时即可实现创建并返回引用。
const type_info& typeid(){ /*伪代码*/
type_info ty;
return ty;
}
原理如下:
class A{
private:
A(){}
A(const A&){}
A& operator =(const A&){}
friend A& f();
};
其中f()函数是类A的友元函数,在函数f()中可以创建类A的对象。其返回值是A的引用
A& f(){
A ma;
cout<<”f”<<endl;
return ma;
}
问题:
1 - 这里函数返回的ma和&ma的区别
2 - 函数返回临时变量怎么处理