⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classdefs.cpp

📁 全套软件项目开发文档模板,全套软件项目开发文档模板
💻 CPP
字号:
#include "StdAfx.h"

#include "ClassDefs.h"

#include <iostream>


// Implementation of the nontrivial class...

nontrivial::nontrivial()
{
}

nontrivial::nontrivial(const std::string& s)
   : s_(s)
{
}

nontrivial::nontrivial(const nontrivial& src)
   : s_(src.s_)
{
}

nontrivial::~nontrivial()
{
}

nontrivial& nontrivial::operator=(const nontrivial& src)
{
   if (&src != this)
   {
      nontrivial tmp(src);

      s_ = tmp.s_;
   }

   return *this;
}

void nontrivial::const_op() const
{
   std::cout << "nontrivial::const_op()" << std::endl;
}

void nontrivial::non_const_op(const std::string& s)
{
   std::cout << "nontrivial::non_const_op()" << std::endl;
   s_ += s;
}


// Implementation of the UsesAttorney class

UsesAttorney::UsesAttorney()
{
}

UsesAttorney::~UsesAttorney()
{
}

void UsesAttorney::ua_do_something()
{
   nt_.non_const_op("ua_do_something");
}

int UsesAttorney::ua_h(const nontrivial& nt)
{
   nt.const_op();
   nt_.non_const_op("ua_h");
   return 0;
}

int UsesAttorney::ua_i(nontrivial& nt)
{
   nt.non_const_op("ua_i");
   nt_.non_const_op("ua_i");
   return 1;
}

int UsesAttorney::ua_j(nontrivial nt)
{
   nt_ = nt;
   return 3;
}

int UsesAttorney::ua_k(const nontrivial& nt) const
{
   nt.const_op();
   nt_.const_op();
   return 4;
}

int UsesAttorney::ua_l(nontrivial& nt) const
{
   nt.non_const_op("ua_l");
   nt_.const_op();
   return 5;
}

int UsesAttorney::ua_m(nontrivial nt) const
{
   nt.const_op();
   nt.non_const_op("ua_m");
   nt_.const_op();
   return 6;
}

nontrivial UsesAttorney::ua_n()
{
   nt_.non_const_op("ua_n");
   return nt_;
}

nontrivial UsesAttorney::ua_o() const
{
   nt_.const_op();
   return nt_;
}


// Implementation of the DoesntUseAttorney class

DoesntUseAttorney::DoesntUseAttorney()
{
}

DoesntUseAttorney::~DoesntUseAttorney()
{
}

void DoesntUseAttorney::dua_do_something()
{
   nt_.non_const_op("dua_do_something");
}

int DoesntUseAttorney::dua_h(const nontrivial& nt)
{
   nt.const_op();
   nt_.non_const_op("dua_h");
   return 0;
}

int DoesntUseAttorney::dua_i(nontrivial& nt)
{
   nt.non_const_op("dua_i");
   nt_.non_const_op("dua_i");
   return 1;
}

int DoesntUseAttorney::dua_j(nontrivial nt)
{
   nt_ = nt;
   return 3;
}

int DoesntUseAttorney::dua_k(const nontrivial& nt) const
{
   nt.const_op();
   nt_.const_op();
   return 4;
}

int DoesntUseAttorney::dua_l(nontrivial& nt) const
{
   nt.non_const_op("dua_l");
   nt_.const_op();
   return 5;
}

int DoesntUseAttorney::dua_m(nontrivial nt) const
{
   nt.const_op();
   nt.non_const_op("dua_m");
   nt_.const_op();
   return 6;
}

nontrivial DoesntUseAttorney::dua_n()
{
   nt_.non_const_op("dua_n");
   return nt_;
}

nontrivial DoesntUseAttorney::dua_o() const
{
   nt_.const_op();
   return nt_;
}

//	The comments in the following two functions show the assembly code
//	for the calls being made to the Attorney or directly to the grantor
//	class in the Release configuration.


//	Testing access to UsesAttorney via Attorney

void Attorney_test()
{
   UsesAttorney usesAttorney;

   usesAttorney.ua_do_something();

   nontrivial nt;
   nontrivial nt2("hello");

   Attorney::ua_h(usesAttorney, nt);
   // 133:      Attorney::ua_h(usesAttorney, nt);
   // 004047A7   lea         ecx,[esp+38h]
   // 004047AB   push        ecx
   // 004047AC   lea         ecx,[esp+28h]
   // 004047B0   call        UsesAttorney::ua_h (00404110)

   Attorney::ua_i(usesAttorney, nt);
   // 134:      Attorney::ua_i(usesAttorney, nt);
   // 004047B5   lea         edx,[esp+38h]
   // 004047B9   lea         ecx,[esp+24h]
   // 004047BD   push        edx
   // 004047BE   call        UsesAttorney::ua_i (004041f0)

   Attorney::ua_j(usesAttorney, nt);
   // 135:      Attorney::ua_j(usesAttorney, nt);
   // 004047C3   sub         esp,14h
   // 004047C6   lea         eax,[esp+4Ch]
   // 004047CA   mov         ecx,esp
   // 004047CC   mov         dword ptr [esp+24h],esp
   // 004047D0   push        eax
   // 004047D1   call        nontrivial::nontrivial (00403b30)
   // 004047D6   lea         ecx,[esp+38h]
   // 004047DA   call        UsesAttorney::ua_j (00404360)

   Attorney::ua_k(usesAttorney, nt);
   // 136:      Attorney::ua_k(usesAttorney, nt);
   // 004047DF   lea         ecx,[esp+38h]
   // 004047E3   push        ecx
   // 004047E4   lea         ecx,[esp+28h]
   // 004047E8   call        UsesAttorney::ua_k (004043b0)

   Attorney::ua_l(usesAttorney, nt);
   // 137:      Attorney::ua_l(usesAttorney, nt);
   // 004047ED   lea         edx,[esp+38h]
   // 004047F1   lea         ecx,[esp+24h]
   // 004047F5   push        edx
   // 004047F6   call        UsesAttorney::ua_l (004043d0)

   Attorney::ua_m(usesAttorney, nt);
   // 138:      Attorney::ua_m(usesAttorney, nt);
   // 004047FB   sub         esp,14h
   // 004047FE   lea         eax,[esp+4Ch]
   // 00404802   mov         ecx,esp
   // 00404804   mov         dword ptr [esp+24h],esp
   // 00404808   push        eax
   // 00404809   call        nontrivial::nontrivial (00403b30)
   // 0040480E   lea         ecx,[esp+38h]
   // 00404812   call        UsesAttorney::ua_m (004044c0)

   nt2 = Attorney::ua_n(usesAttorney);
   // 139:
   // 140:      nt2 = Attorney::ua_n(usesAttorney);
   // 00404817   lea         ecx,[esp+24h]
   // 0040481B   lea         edx,[esp+60h]
   // 0040481F   push        ecx
   // 00404820   push        edx
   // 00404821   call        Attorney::ua_n (004048b0)
   // 00404826   add         esp,8
   // 00404829   push        eax
   // 0040482A   lea         ecx,[esp+50h]
   // 0040482E   mov         byte ptr [esp+80h],5
   // 00404836   call        nontrivial::operator= (00403cd0)
   // 0040483B   lea         ecx,[esp+60h]
   // 0040483F   mov         byte ptr [esp+7Ch],bl
   // 00404843   call        nontrivial::~nontrivial (00403c80)

   nt2 = Attorney::ua_o(usesAttorney);
   // 141:      nt2 = Attorney::ua_o(usesAttorney);
   // 00404848   lea         eax,[esp+24h]
   // 0040484C   lea         ecx,[esp+60h]
   // 00404850   push        eax
   // 00404851   push        ecx
   // 00404852   call        Attorney::ua_o (004048d0)
   // 00404857   add         esp,8
   // 0040485A   push        eax
   // 0040485B   lea         ecx,[esp+50h]
   // 0040485F   mov         byte ptr [esp+80h],6
   // 00404867   call        nontrivial::operator= (00403cd0)
   // 0040486C   lea         ecx,[esp+60h]
   // 00404870   call        nontrivial::~nontrivial (00403c80)
}

// Testing access to DoesntUseAttorney via Attorney

void NonAttorney_test()
{
   DoesntUseAttorney doesntUseAttorney;

   doesntUseAttorney.dua_do_something();

   nontrivial nt;
   nontrivial nt2("hello");

   doesntUseAttorney.dua_h(nt);
   // 225:      doesntUseAttorney.dua_h(nt);
   // 004050A4   lea         edx,[esp+3Ch]
   // 004050A8   lea         ecx,[esp+28h]
   // 004050AC   push        edx
   // 004050AD   mov         dword ptr [esp+20h],ebx
   // 004050B1   mov         dword ptr [esp+24h],ebx
   // 004050B5   mov         dword ptr [esp+28h],ebx
   // 004050B9   call        DoesntUseAttorney::dua_h (004049f0)

   doesntUseAttorney.dua_i(nt);
   // 226:      doesntUseAttorney.dua_i(nt);
   // 004050BE   lea         eax,[esp+3Ch]
   // 004050C2   lea         ecx,[esp+28h]
   // 004050C6   push        eax
   // 004050C7   call        DoesntUseAttorney::dua_i (00404ad0)

   doesntUseAttorney.dua_j(nt);
   // 227:      doesntUseAttorney.dua_j(nt);
   // 004050CC   sub         esp,14h
   // 004050CF   lea         edx,[esp+50h]
   // 004050D3   mov         ecx,esp
   // 004050D5   mov         dword ptr [esp+28h],esp
   // 004050D9   push        edx
   // 004050DA   call        nontrivial::nontrivial (00403b30)
   // 004050DF   lea         ecx,[esp+3Ch]
   // 004050E3   call        DoesntUseAttorney::dua_j (00404c40)

   doesntUseAttorney.dua_k(nt);
   // 228:      doesntUseAttorney.dua_k(nt);
   // 004050E8   lea         eax,[esp+3Ch]
   // 004050EC   lea         ecx,[esp+28h]
   // 004050F0   push        eax
   // 004050F1   call        DoesntUseAttorney::dua_k (00404c90)

   doesntUseAttorney.dua_l(nt);
   // 229:      doesntUseAttorney.dua_l(nt);
   // 004050F6   lea         ecx,[esp+3Ch]
   // 004050FA   push        ecx
   // 004050FB   lea         ecx,[esp+2Ch]
   // 004050FF   call        DoesntUseAttorney::dua_l (00404cb0)

   doesntUseAttorney.dua_m(nt);
   // 230:      doesntUseAttorney.dua_m(nt);
   // 00405104   sub         esp,14h
   // 00405107   lea         edx,[esp+50h]
   // 0040510B   mov         ecx,esp
   // 0040510D   mov         dword ptr [esp+28h],esp
   // 00405111   push        edx
   // 00405112   call        nontrivial::nontrivial (00403b30)
   // 00405117   lea         ecx,[esp+3Ch]
   // 0040511B   call        DoesntUseAttorney::dua_m (00404da0)

   nt2 = doesntUseAttorney.dua_n();
   // 231:
   // 232:      nt2 = doesntUseAttorney.dua_n();
   // 00405120   lea         eax,[esp+64h]
   // 00405124   lea         ecx,[esp+28h]
   // 00405128   push        eax
   // 00405129   call        DoesntUseAttorney::dua_n (00404e90)
   // 0040512E   push        eax
   // 0040512F   lea         ecx,[esp+54h]
   // 00405133   mov         byte ptr [esp+84h],5
   // 0040513B   call        nontrivial::operator= (00403cd0)
   // 00405140   lea         ecx,[esp+64h]
   // 00405144   mov         byte ptr [esp+80h],4
   // 0040514C   call        nontrivial::~nontrivial (00403c80)

   nt2 = doesntUseAttorney.dua_o();
   // 233:      nt2 = doesntUseAttorney.dua_o();
   // 00405151   lea         ecx,[esp+64h]
   // 00405155   push        ecx
   // 00405156   lea         ecx,[esp+2Ch]
   // 0040515A   call        DoesntUseAttorney::dua_o (00404f90)
   // 0040515F   push        eax
   // 00405160   lea         ecx,[esp+54h]
   // 00405164   mov         byte ptr [esp+84h],6
   // 0040516C   call        nontrivial::operator= (00403cd0)
   // 00405171   lea         ecx,[esp+64h]
   // 00405175   call        nontrivial::~nontrivial (00403c80)
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -