网站服务器需要多少钱化妆品网站做的好的
网站服务器需要多少钱,化妆品网站做的好的,网站推广和优化教程,末备案网站如何做cdn《C新经典对象模型》之第7章 模板实例化语义学 7.1 模板及其实例化详细分析7.1.1 函数模板7.1.2 类模板的实例化分析7.1.3 多个源文件中使用类模板07.01.cpp 7.2 炫技写法7.2.1 不能被继承的类7.2.2 类外调用私有虚成员函数07.02.cpp 7.1 模板及其实例化详细分析
7.1.1 函数模… 《C新经典对象模型》之第7章 模板实例化语义学 7.1 模板及其实例化详细分析7.1.1 函数模板7.1.2 类模板的实例化分析7.1.3 多个源文件中使用类模板07.01.cpp 7.2 炫技写法7.2.1 不能被继承的类7.2.2 类外调用私有虚成员函数07.02.cpp 7.1 模板及其实例化详细分析
7.1.1 函数模板
template class T
T funcadd(const T a, const T b)
{T addhe a b;return addhe;
}coutfuncadd(12, 14)endl;
//dumpbin
//nm编译器编译时根据funcadd的调用来确定函数模板中T的类型。 int funcadd(int const , int const );
7.1.2 类模板的实例化分析
template class T
struct ATPL
{T m_i, m_j;ATPL(T tmpi 0, T tmpj 0) : m_i(tmpi), m_j(tmpj) {}
};类模板中的枚举类型
template class T
struct ATPL
{enum ECURRSTATUS{E_CS_Busy,E_CS_Free,};T m_i, m_j;ATPL(T tmpi 0, T tmpj 0) : m_i(tmpi), m_j(tmpj) {}
};ATPLint::ECURRSTATUS myenum ATPLint::E_CS_Busy;ATPLint::ECURRSTATUS myenum2 ATPLint::E_CS_Free;ATPLdouble::ECURRSTATUS myenum3 ATPLdouble::E_CS_Free;类模板中的静态成员变量
template class T
struct ATPL
{T m_i, m_j;ATPL(T tmpi 0, T tmpj 0) : m_i(tmpi), m_j(tmpj) {}static int m_sti;static T m_sti2;
};template class T
int ATPLT::m_sti 10;
template class T
T ATPLT::m_sti2 10;//必须要和10兼容的类型ATPLint::m_sti 18;cout ATPLint::m_sti endl;ATPLfloat::m_sti 21;cout ATPLfloat::m_sti endl;//ATPLstring::m_sti2;//errorATPLint::m_sti2 132;cout ATPLint::m_sti2 endl;ATPLfloat::m_sti2 1050.5;cout ATPLfloat::m_sti2 endl;类模板的实例化
template class T
struct ATPL
{T m_i, m_j;ATPL(T tmpi 0, T tmpj 0) : m_i(tmpi), m_j(tmpj) {}
};ATPLint *pobj nullptr;//未实例化类const ATPLint yobj 0; // 因为构造函数允许缺省参数这里有隐式类型转换//等价于//ATPLint tmpobj(0);//const ATPLint yobj tmpobj;成员函数的实例化
template class T
struct ATPL
{T m_i, m_j;ATPL(T tmpi 0, T tmpj 0) : m_i(tmpi), m_j(tmpj) {}void func1() const { cout ATPL::func1() endl; }void func2() const { cout ATPL::func2() endl; }
};const ATPLint yobj 0;yobj.func1();//成员函数调用时才会实例化出成员函数7.1.3 多个源文件中使用类模板
mytemplate.h
#pragma once
#include iostream
using namespace std;template class T
T funadd(const T a, const T b)
{T addhe a b;return addhe;
}template class T
struct ATPL
{enum ECURRSTATUS{E_CS_Busy,E_CS_Free,};T m_i, m_j;ATPL(T tmpi 0, T tmpj 0) : m_i(tmpi), m_j(tmpj) {}static int m_sti;static T m_sti2;void func1() const { cout ATPL::func1() endl; }void func2() const { cout ATPL::func2() endl; }
};template class T
int ATPLT::m_sti 10;template class T
T ATPLT::m_sti2 10;MyProject.cpp
#include mytemplate.hvoid myfunc()
{ATPLint myobj;//即使没调用myfunc()函数也会实例化ATPLint类myobj.m_sti2 18;cout myobj.m_sti2 endl;
}myfunc.cpp
#include mytemplate.hint ftest()
{ATPLint myobj;//即使没调用myfunc()函数也会实例化ATPLint类myobj.m_sti2 21;cout myobj.m_sti2 endl;return 15;
}编译时可能多个.obj文件产生了多个相同的ATPL类但链接时只保留一个ATPL类实体其余忽略掉。
虚函数的实例化
template class T
struct ATPL
{enum ECURRSTATUS{E_CS_Busy,E_CS_Free,};T m_i, m_j;ATPL(T tmpi 0, T tmpj 0) : m_i(tmpi), m_j(tmpj) {}static int m_sti;static T m_sti2;void func1() const { cout ATPL::func1() endl; }void func2() const { cout ATPL::func2() endl; }virtual void virfunc1() { cout ATPL::virfunc1() endl; }virtual void virfunc2() { cout ATPL::virfunc2() endl; }
};template class T
int ATPLT::m_sti 10;template class T
T ATPLT::m_sti2 10;类模板存在虚函数时会实例化所以虚函数即使未调用。 虚函数产生虚函数表虚函数表需要放置各个虚函数的地址所以实例化出所以虚函数。
显示实例化
//.cpp文件中
template class ATPLdouble;类模板的显示实例化所有内容类、成员函数、虚函数、静态成员变量等都实例化出来无论是否调用。
//.cpp文件中
template void ATPLdouble::func2() const;实例化单独的成员函数类并未实例化。
07.01.cpp
#include cstdio
#include iostream
using namespace std;template class T
T funadd(const T a, const T b)
{T addhe a b;return addhe;
}template class T
struct ATPL
{enum ECURRSTATUS{E_CS_Busy,E_CS_Free,};T m_i, m_j;ATPL(T tmpi 0, T tmpj 0) : m_i(tmpi), m_j(tmpj) {}static int m_sti;static T m_sti2;void func1() const { cout ATPL::func1() endl; }void func2() const { cout ATPL::func2() endl; }virtual void virfunc1() { cout ATPL::virfunc1() endl; }virtual void virfunc2() { cout ATPL::virfunc2() endl; }
};template class T
int ATPLT::m_sti 10;template class T
T ATPLT::m_sti2 10;void myfunc()
{ATPLint myobj;myobj.m_sti2 18;cout myobj.m_sti2 endl;
}int main()
{cout funadd(12, 14) endl;{ATPLint::ECURRSTATUS myenum ATPLint::E_CS_Busy;ATPLint::ECURRSTATUS myenum2 ATPLint::E_CS_Free;ATPLdouble::ECURRSTATUS myenum3 ATPLdouble::E_CS_Free;}{ATPLint::m_sti 18;cout ATPLint::m_sti endl;ATPLfloat::m_sti 21;cout ATPLfloat::m_sti endl;ATPLint::m_sti2 132;cout ATPLint::m_sti2 endl;ATPLfloat::m_sti2 1050.5;cout ATPLfloat::m_sti2 endl;}ATPLint *pobj nullptr;{const ATPLint yobj 0; // 因为构造函数允许缺省参数这里有隐式类型转换yobj.func1();}cout sizeof(ATPLint) endl;cout Over!\n;return 0;
}7.2 炫技写法
7.2.1 不能被继承的类
使用final关键字友元函数虚继承友元破坏封装虚继承消耗大 class A
{
private:A() {}friend class B; // B可以调用A的私有构造函数
};
class B : virtual public A // 虚继承A
{
public:int m_b;
};
// 虚基类A的构造函数由孙子类C调用
// 但虚基类A的构造函数私有只有友元类B能调用孙子类C无法调用
// 无法创建C类即B类无法被继承
class C : public B
{
public:int m_c;
};{B myobjb;myobjb.m_b 15;// C myobjc;// myobjc.m_c 20;}7.2.2 类外调用私有虚成员函数
class A2
{
private:virtual void virfunc(){myfunc();}void myfunc(){cout A::myfunc() endl;}
};{A2 aobj;(reinterpret_castvoid (*)()(**(long ***)(aobj)))();//通过虚函数表指针调用虚函数//long*** pvptr (long ***)aobj;//long** vptr *pvptr;//typedef void(*Func)();//Func f (Func)*vptr;//f();}07.02.cpp
#include iostream
using namespace std;class A
{
private:A() {}friend class B; // B可以调用A的私有构造函数
};
class B : virtual public A // 虚继承A
{
public:int m_b;
};
// 虚基类A的构造函数由孙子类C调用
// 但虚基类A的构造函数私有只有友元类B能调用孙子类C无法调用
// 无法创建C类即B类无法被继承
class C : public B
{
public:int m_c;
};class A2
{
private:virtual void virfunc(){myfunc();}void myfunc(){cout A::myfunc() endl;}
};int main()
{{B myobjb;myobjb.m_b 15;// C myobjc;// myobjc.m_c 20;}{A2 aobj;(reinterpret_castvoid (*)()(**(long ***)(aobj)))();// 通过虚函数表指针调用虚函数// long*** pvptr (long ***)aobj;// long** vptr *pvptr;// typedef void(*Func)();// Func f (Func)*vptr;// f();}cout Over!\n;return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91917.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!