{"id":924,"date":"2024-08-09T20:23:01","date_gmt":"2024-08-09T20:23:01","guid":{"rendered":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/?page_id=924"},"modified":"2025-01-26T18:31:12","modified_gmt":"2025-01-26T18:31:12","slug":"this-temporary-objects","status":"publish","type":"page","link":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/topics\/c-details\/classes\/this-temporary-objects\/","title":{"rendered":"this &amp; Temporary Objects"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"this_Temporary_Objects\"><\/span>this &amp; Temporary Objects<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Here is the next stage of our saga about C++ classes&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_this_Pointer\"><\/span>The <strong>this<\/strong> Pointer<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>When you invoke a (non-static) class member function:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code><strong>Complex c(1.0, 2.0);\n \/\/ ...\nc.Print();<\/strong><\/code><\/pre>\n\n\n\n<p>within the member function, there is available a <em>pointer called<\/em> <strong>this<\/strong>.<\/p>\n\n\n\n<p>The <strong>this<\/strong> pointer for a class <strong>T<\/strong> is <em>implicitly defined<\/em> as:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code><strong>T * const this;&nbsp; \/\/ means what? Can you say it in words?<\/strong><\/code><\/pre>\n\n\n\n<p>(later, we\u2019ll see cases where this changes)<\/p>\n\n\n\n<p><strong>this<\/strong> is implicitly initialized <em>to point to the instance of the class that was used to invoke the member function<\/em>.<\/p>\n\n\n\n<p>For example, assuming the existence of a <strong>String<\/strong> class, the call:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code><strong>String s1(\"Hello!\");\nString s2(\"\");\ns2 = s1.Left(5);<\/strong><\/code><\/pre>\n\n\n\n<p>is equivalent to something like:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code>String s1(\"Hello!\");\nString s2(\"\");\ns2 = Left(<strong>&amp;s1<\/strong>, 5);<\/code><\/pre>\n\n\n\n<p>In other words, there is a <em>hidden &#8216;parameter&#8217;<\/em> supplied to the member function behind the scenes.<\/p>\n\n\n\n<p>Access via <strong>this<\/strong> is only within <em>class scope<\/em>, since it&#8217;s only available from within member functions of the class.<\/p>\n\n\n\n<p>In most cases, references via <strong>this<\/strong> are implied.&nbsp; <\/p>\n\n\n\n<p>For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code><strong>Complex::Complex(double r)\n{\n  real = r;\n  imag = 0.0;\n}<\/strong>\n<\/code><\/pre>\n\n\n\n<p>is equivalent to:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code>Complex::Complex(double r)\n{\n  <strong>this-&gt;<\/strong>real = r;\n  <strong>this-&gt;<\/strong>imag = 0.0;\n}<\/code><\/pre>\n\n\n\n<p>However, there are cases where you need to use <strong>this<\/strong> explicitly.&nbsp; We&#8217;ll see some of these in a short while.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Temporary_Objects\"><\/span>Temporary Objects<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>There are cases where the compiler needs to construct <em>temporary objects<\/em>.<\/p>\n\n\n\n<p>For example:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>Here&#8217;s a very simple Complex class, together with its class method functions, annotated to produce output at suitable times.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\/\/\n\/\/  Complex.h\n\/\/  Temporary Objects\n\/\/\n\/\/  Created by Bryan Higgs on 8\/19\/24.\n\/\/\n\n#ifndef Complex_h\n#define Complex_h\n\nclass Complex\n{\npublic:\n  Complex(double r, double i = 0.0);\n  Complex(const Complex &amp;src);\n  ~Complex();\n  void Print() const;\n  \n  double m_r, m_i; \/\/ Real, imaginary\n  \n   \/\/ ...\n};\n\n#endif \/* Complex_h *\/\" style=\"color:#000000;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki light-plus\" style=\"background-color: #FFFFFF\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Complex.h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Temporary Objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Created by Bryan Higgs on 8\/19\/24.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#ifndef<\/span><span style=\"color: #0000FF\"> Complex_h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#define<\/span><span style=\"color: #0000FF\"> Complex_h<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">class<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #267F99\">Complex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">public:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">Complex<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #0000FF\">double<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #001080\">r<\/span><span style=\"color: #000000\">, <\/span><span style=\"color: #0000FF\">double<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #001080\">i<\/span><span style=\"color: #000000\"> = <\/span><span style=\"color: #098658\">0.0<\/span><span style=\"color: #000000\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">Complex<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #0000FF\">const<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #0000FF\">&amp;<\/span><span style=\"color: #001080\">src<\/span><span style=\"color: #000000\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">~Complex<\/span><span style=\"color: #000000\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #0000FF\">void<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">() <\/span><span style=\"color: #0000FF\">const<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #0000FF\">double<\/span><span style=\"color: #000000\"> m_r, m_i;<\/span><span style=\"color: #008000\"> \/\/ Real, imaginary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">   \/\/ ...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#endif<\/span><span style=\"color: #008000\"> \/* Complex_h *\/<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\/\/\n\/\/  Complex.cpp\n\/\/  Temporary Objects\n\/\/\n\/\/  Created by Bryan Higgs on 8\/19\/24.\n\/\/\n\n#include &lt;iostream&gt;\n\n#include &quot;Complex.h&quot;\n\nComplex::Complex(double r, double i)\n{\n  std::cout &lt;&lt; &quot;Constructing instance of Complex from doubles [&quot;\n            &lt;&lt; r &lt;&lt; &quot;,&quot; &lt;&lt; i &lt;&lt; &quot;]&quot; &lt;&lt; std::endl;\n}\n\nComplex::Complex(const Complex &amp;src)\n{\n  std::cout &lt;&lt; &quot;Constructing instance of Complex using copy constructor from &quot;;\n  src.Print();\n  std::cout &lt;&lt; std::endl;\n}\n\nComplex::~Complex()\n{\n  std::cout &lt;&lt; &quot;Destroying instance of Complex &quot;;\n  this-&gt;Print();\n  std::cout &lt;&lt; std::endl;\n}\n\nvoid Complex::Print() const\n{\n  std::cout &lt;&lt; &quot;[&quot; &lt;&lt; m_r &lt;&lt; &quot;,&quot; &lt;&lt; m_i &lt;&lt; &quot;] &quot;;\n}\" style=\"color:#000000;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki light-plus\" style=\"background-color: #FFFFFF\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Complex.cpp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Temporary Objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Created by Bryan Higgs on 8\/19\/24.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&quot;Complex.h&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\">::<\/span><span style=\"color: #795E26\">Complex<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #0000FF\">double<\/span><span style=\"color: #000000\"> r, <\/span><span style=\"color: #0000FF\">double<\/span><span style=\"color: #000000\"> i)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;Constructing instance of Complex from doubles [&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">            &lt;&lt; r &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;,&quot;<\/span><span style=\"color: #000000\"> &lt;&lt; i &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;]&quot;<\/span><span style=\"color: #000000\"> &lt;&lt; <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\">::<\/span><span style=\"color: #795E26\">Complex<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #0000FF\">const<\/span><span style=\"color: #000000\"> Complex &amp;src)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;Constructing instance of Complex using copy constructor from &quot;<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #001080\">src<\/span><span style=\"color: #000000\">.<\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\">::~<\/span><span style=\"color: #795E26\">Complex<\/span><span style=\"color: #000000\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;Destroying instance of Complex &quot;<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #0000FF\">this<\/span><span style=\"color: #000000\">-&gt;<\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">void<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\">::<\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">() <\/span><span style=\"color: #0000FF\">const<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;[&quot;<\/span><span style=\"color: #000000\"> &lt;&lt; m_r &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;,&quot;<\/span><span style=\"color: #000000\"> &lt;&lt; m_i &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;] &quot;<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>And here&#8217;s a test program to try things out, with its own annotated output:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\/\/\n\/\/  TestComplex.cpp\n\/\/  Temporary Objects\n\/\/\n\/\/  Created by Bryan Higgs on 8\/19\/24.\n\/\/\n\n#include &lt;iostream&gt;\n#include &quot;Complex.h&quot;\n\nComplex f(Complex c)\n{\n  std::cout &lt;&lt; &quot;f: Complex argument c: &quot;;\n  c.Print();\n  std::cout &lt;&lt; std::endl;\n  \/\/ Do something...\n  return c;\n}\n\nint main()\n{\n  Complex a(1.0);\n  Complex b = f(Complex(2.0));\n  a = f(a);\n  return 0;\n}\" style=\"color:#000000;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki light-plus\" style=\"background-color: #FFFFFF\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  TestComplex.cpp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Temporary Objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Created by Bryan Higgs on 8\/19\/24.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&quot;Complex.h&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #795E26\">f<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #001080\">c<\/span><span style=\"color: #000000\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;f: Complex argument c: &quot;<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #001080\">c<\/span><span style=\"color: #000000\">.<\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">  \/\/ Do something...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #AF00DB\">return<\/span><span style=\"color: #000000\"> c;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">int<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #795E26\">main<\/span><span style=\"color: #000000\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  Complex <\/span><span style=\"color: #795E26\">a<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #098658\">1.0<\/span><span style=\"color: #000000\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  Complex b = <\/span><span style=\"color: #795E26\">f<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #795E26\">Complex<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #098658\">2.0<\/span><span style=\"color: #000000\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  a = <\/span><span style=\"color: #795E26\">f<\/span><span style=\"color: #000000\">(a);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #AF00DB\">return<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #098658\">0<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>Here&#8217;s the output the program produces:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\" style=\"padding-top:0px;padding-bottom:0px\"><code>Constructing instance of Complex from doubles &#91;1,0]\nConstructing instance of Complex from doubles &#91;2,0]\nf: Complex argument c: &#91;0,6.95161e-310] \nConstructing instance of Complex using copy constructor from &#91;0,6.95161e-310] \nDestroying instance of Complex &#91;0,6.95161e-310] \nConstructing instance of Complex using copy constructor from &#91;6.95167e-310,6.95161e-310] \nf: Complex argument c: &#91;0,0] \nConstructing instance of Complex using copy constructor from &#91;0,0] \nDestroying instance of Complex &#91;0,6.95161e-310] \nDestroying instance of Complex &#91;0,0] \nDestroying instance of Complex &#91;6.95161e-310,6.95161e-310] \nDestroying instance of Complex &#91;0,6.95161e-310] \nProgram ended with exit code: 0<\/code><\/pre>\n\n\n\n<p>Can you explain this output? Can you see any strangenesses?<\/p>\n\n\n\n<p>What&#8217;s going on?<\/p>\n\n\n\n<p>How many temporary objects (i.e. without a name) can you identify above?<\/p>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Creation_and_Destruction_of_Temporary_Objects\"><\/span>Creation and Destruction of Temporary Objects<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>There are two major questions about temporary objects:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>When are they created?<\/em><\/li>\n\n\n\n<li><em>When are they destroyed?<\/em><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Creation_of_Temporary_Objects\"><\/span>Creation of Temporary Objects<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>In this case:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code>Complex f(Complex c)\n{\n  \/\/ ...\n}\n\/\/ ...\nComplex a(1.0);\t\na = f(a);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>A temporary object is created for the argument on the call to <\/em><em>f()<\/em><em>.<\/em><\/li>\n\n\n\n<li><em>A temporary object is created for the value returned from <\/em><em>f()<\/em><em>.<\/em><\/li>\n<\/ul>\n\n\n\n<p>Why?&nbsp; Is this desirable?<\/p>\n\n\n\n<p>How might one avoid this?<\/p>\n\n\n\n<p class=\"has-medium-font-size\">When a temporary object is <em>created<\/em>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The compiler uses <em>the appropriate constructor<\/em> to construct the object.<\/li>\n\n\n\n<li>If there is no appropriate constructor, then compilation <em>will fail with an error<\/em>.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>For example, if we remove the Complex(double r, double i) constructor from the previous example, we get:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\/\/\n\/\/  Complex.h\n\/\/  Temporary Objects\n\/\/\n\/\/  Created by Bryan Higgs on 8\/19\/24.\n\/\/\n\n#ifndef Complex_h\n#define Complex_h\n\nclass Complex\n{\npublic:\n  \/\/ Complex(double r, double i = 0.0);\n  Complex(const Complex &amp;src);\n  ~Complex();\n  void Print() const;\n  \n  double m_r, m_i; \/\/ Real, imaginary\n  \n   \/\/ ...\n};\n\n#endif \/* Complex_h *\/\" style=\"color:#000000;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki light-plus\" style=\"background-color: #FFFFFF\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Complex.h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Temporary Objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Created by Bryan Higgs on 8\/19\/24.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#ifndef<\/span><span style=\"color: #0000FF\"> Complex_h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#define<\/span><span style=\"color: #0000FF\"> Complex_h<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">class<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #267F99\">Complex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">public:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #008000\">  \/\/ Complex(double r, double i = 0.0);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">Complex<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #0000FF\">const<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #0000FF\">&amp;<\/span><span style=\"color: #001080\">src<\/span><span style=\"color: #000000\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">~Complex<\/span><span style=\"color: #000000\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #0000FF\">void<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">() <\/span><span style=\"color: #0000FF\">const<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #0000FF\">double<\/span><span style=\"color: #000000\"> m_r, m_i;<\/span><span style=\"color: #008000\"> \/\/ Real, imaginary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">   \/\/ ...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#endif<\/span><span style=\"color: #008000\"> \/* Complex_h *\/<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\/\/\n\/\/  TestComplex.cpp\n\/\/  Temporary Objects\n\/\/\n\/\/  Created by Bryan Higgs on 8\/19\/24.\n\/\/\n\n#include &lt;iostream&gt;\n#include &quot;Complex.h&quot;\n\nComplex f(Complex c)\n{\n  std::cout &lt;&lt; &quot;f: Complex argument c: &quot;;\n  c.Print();\n  std::cout &lt;&lt; std::endl;\n  \/\/ Do something...\n  return c;\n}\n\nint main()\n{\n  Complex a(1.0); \/\/ No matching constructor for initialization of 'Complex'\n  Complex b = f(Complex(2.0)); \/\/ No matching conversion for functional-style cast from 'double' to 'Complex'\n  a = f(a);\n  return 0;\n}\n\" style=\"color:#000000;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki light-plus\" style=\"background-color: #FFFFFF\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  TestComplex.cpp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Temporary Objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Created by Bryan Higgs on 8\/19\/24.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&quot;Complex.h&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #795E26\">f<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #267F99\">Complex<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #001080\">c<\/span><span style=\"color: #000000\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;f: Complex argument c: &quot;<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #001080\">c<\/span><span style=\"color: #000000\">.<\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">  \/\/ Do something...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #AF00DB\">return<\/span><span style=\"color: #000000\"> c;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">int<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #795E26\">main<\/span><span style=\"color: #000000\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #000000\">  Complex <\/span><span style=\"color: #795E26\">a<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #098658\">1.0<\/span><span style=\"color: #000000\">);<\/span><span style=\"color: #008000\"> \/\/ No matching constructor for initialization of &#39;Complex&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #000000\">  Complex b = <\/span><span style=\"color: #795E26\">f<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #795E26\">Complex<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #098658\">2.0<\/span><span style=\"color: #000000\">));<\/span><span style=\"color: #008000\"> \/\/ No matching conversion for functional-style cast from &#39;double&#39; to &#39;Complex&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  a = <\/span><span style=\"color: #795E26\">f<\/span><span style=\"color: #000000\">(a);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #AF00DB\">return<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #098658\">0<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Destruction_of_Temporary_Objects\"><\/span>Destruction of Temporary Objects<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p class=\"has-medium-font-size\">When is a temporary object <em>destroyed<\/em>?<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<ul class=\"wp-block-list\">\n<li>Back in the early days of C++, this used to be subject to the whims of each vendor, but that was found totally unacceptable, since it prevented programmers from writing portable code.<\/li>\n\n\n\n<li>Now, the ISO C++ committee has specified that the lifetime of a temporary object is <em>until the end of the statement (more or less) in which it is created<\/em>.<\/li>\n<\/ul>\n\n\n\n<p>This can cause problems, if you&#8217;re not careful.<\/p>\n<\/blockquote>\n\n\n\n<p>Here&#8217;s a really dumb string class to illustrate the dangers:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\/\/\n\/\/  MyString.h\n\/\/  Temporary Objects (MyString example)\n\/\/\n\/\/  NOTE: A really dumb string class!\n\/\/\n\/\/  Created by Bryan Higgs on 8\/20\/24.\n\/\/\n\n#ifndef MyString_h\n#define MyString_h\n\nclass MyString\n{\npublic:\n  MyString(const char *string);\n  \n  void Print();\n\n  ; \/\/ ...\n  char m_string[10]; \/\/ Limited string size\n};\n\n#endif \/* MyString_h *\/\" style=\"color:#000000;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki light-plus\" style=\"background-color: #FFFFFF\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  MyString.h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Temporary Objects (MyString example)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  NOTE: A really dumb string class!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Created by Bryan Higgs on 8\/20\/24.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#ifndef<\/span><span style=\"color: #0000FF\"> MyString_h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#define<\/span><span style=\"color: #0000FF\"> MyString_h<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">class<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #267F99\">MyString<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">public:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">MyString<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #0000FF\">const<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #0000FF\">char<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #0000FF\">*<\/span><span style=\"color: #001080\">string<\/span><span style=\"color: #000000\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #0000FF\">void<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  ;<\/span><span style=\"color: #008000\"> \/\/ ...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #0000FF\">char<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #001080\">m_string<\/span><span style=\"color: #000000\">[<\/span><span style=\"color: #098658\">10<\/span><span style=\"color: #000000\">];<\/span><span style=\"color: #008000\"> \/\/ Limited string size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#endif<\/span><span style=\"color: #008000\"> \/* MyString_h *\/<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono-NL.ttf\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\/\/\n\/\/  MyString.cpp\n\/\/  Temporary Objects (MyString example)\n\/\/\n\/\/  Created by Bryan Higgs on 8\/20\/24.\n\/\/\n\n#include &lt;iostream&gt;\n#include &lt;assert.h&gt; \/\/ For assert macro\n#include &lt;stdio.h&gt;  \/\/ for strlen, strcpy\n#include &quot;MyString.h&quot;\n\nMyString::MyString(const char *string)\n{\n  \/\/ It's dangerous to use bare C string handling...\n  assert( string != NULL ); \/\/ Valid pointer?\n  assert( (strlen(string) &lt; 10) ); \/\/ Not too long?\n  \n  strcpy(m_string, string);\n}\n\nvoid MyString::Print()\n{\n  std::cout &lt;&lt; &quot;MyString: '&quot; &lt;&lt; m_string &lt;&lt; &quot;'&quot; &lt;&lt; std::endl;\n}\" style=\"color:#000000;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki light-plus\" style=\"background-color: #FFFFFF\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  MyString.cpp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Temporary Objects (MyString example)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Created by Bryan Higgs on 8\/20\/24.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&lt;assert.h&gt;<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #008000\">\/\/ For assert macro<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&lt;stdio.h&gt;<\/span><span style=\"color: #0000FF\">  <\/span><span style=\"color: #008000\">\/\/ for strlen, strcpy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&quot;MyString.h&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #267F99\">MyString<\/span><span style=\"color: #000000\">::<\/span><span style=\"color: #795E26\">MyString<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #0000FF\">const<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #0000FF\">char<\/span><span style=\"color: #000000\"> *string)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">  \/\/ It&#39;s dangerous to use bare C string handling...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">assert<\/span><span style=\"color: #000000\">( string != <\/span><span style=\"color: #0000FF\">NULL<\/span><span style=\"color: #000000\"> );<\/span><span style=\"color: #008000\"> \/\/ Valid pointer?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">assert<\/span><span style=\"color: #000000\">( (<\/span><span style=\"color: #795E26\">strlen<\/span><span style=\"color: #000000\">(string) &lt; <\/span><span style=\"color: #098658\">10<\/span><span style=\"color: #000000\">) );<\/span><span style=\"color: #008000\"> \/\/ Not too long?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #795E26\">strcpy<\/span><span style=\"color: #000000\">(m_string, string);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">void<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #267F99\">MyString<\/span><span style=\"color: #000000\">::<\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::cout &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;MyString: &#39;&quot;<\/span><span style=\"color: #000000\"> &lt;&lt; m_string &lt;&lt; <\/span><span style=\"color: #A31515\">&quot;&#39;&quot;<\/span><span style=\"color: #000000\"> &lt;&lt; <\/span><span style=\"color: #267F99\">std<\/span><span style=\"color: #000000\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\/\/\n\/\/  main.cpp\n\/\/  Temporary Objects (MyString example)\n\/\/\n\/\/  Created by Bryan Higgs on 8\/20\/24.\n\/\/\n\n#include &lt;iostream&gt;\n#include &quot;MyString.h&quot;\n\nint main(int argc, const char * argv[]) \n{\n  MyString str = MyString(&quot;Hi there!&quot;);\n  str.Print();  \/\/ OK\n  MyString *ptr = &amp;MyString(&quot;Hello!&quot;);\n  ptr-&gt;Print();    \/\/ Surprise!\n  return 0;\n}\" style=\"color:#000000;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki light-plus\" style=\"background-color: #FFFFFF\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  main.cpp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Temporary Objects (MyString example)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/  Created by Bryan Higgs on 8\/20\/24.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #008000\">\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #AF00DB\">#include<\/span><span style=\"color: #0000FF\"> <\/span><span style=\"color: #A31515\">&quot;MyString.h&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #0000FF\">int<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #795E26\">main<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #0000FF\">int<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #001080\">argc<\/span><span style=\"color: #000000\">, <\/span><span style=\"color: #0000FF\">const<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #0000FF\">char<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #0000FF\">*<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #001080\">argv<\/span><span style=\"color: #000000\">[]) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  MyString str = <\/span><span style=\"color: #795E26\">MyString<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #A31515\">&quot;Hi there!&quot;<\/span><span style=\"color: #000000\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #001080\">str<\/span><span style=\"color: #000000\">.<\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">();<\/span><span style=\"color: #008000\">  \/\/ OK<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #000000\">  MyString *ptr = &amp;<\/span><span style=\"color: #795E26\">MyString<\/span><span style=\"color: #000000\">(<\/span><span style=\"color: #A31515\">&quot;Hello!&quot;<\/span><span style=\"color: #000000\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #001080\">ptr<\/span><span style=\"color: #000000\">-&gt;<\/span><span style=\"color: #795E26\">Print<\/span><span style=\"color: #000000\">();<\/span><span style=\"color: #008000\">    \/\/ Surprise!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">  <\/span><span style=\"color: #AF00DB\">return<\/span><span style=\"color: #000000\"> <\/span><span style=\"color: #098658\">0<\/span><span style=\"color: #000000\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #000000\">}<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>which, when I was first creating this course, produced the following  output on my machine, using Microsoft Visual C++:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code><strong>Hi there!\u258c\u258c\u258c\u258c\u258c\u258c\u258c\u258c\u258c\u258c\u258c<\/strong><\/code><\/pre>\n\n\n\n<p>In other words, garbage.<\/p>\n\n\n\n<p>Now, using an up to date C++ compiler, the compiler catches the problem at compile time, with the error:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"padding-top:0px;padding-bottom:0px\"><code>Taking the address of a temporary object of type 'MyString'<\/code><\/pre>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Well, two more topics down:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>this<\/li>\n\n\n\n<li>Temporary Objects<\/li>\n<\/ul>\n\n\n\n<p>Lots more to learn!<\/p>\n\n\n\n<p>Onward!<\/p>\n\n\n\n<div style=\"height:49px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size has-medium-font-size\"><a class=\"wp-block-button__link has-palette-color-8-color has-text-color has-link-color wp-element-button\" href=\"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/topics\/c-details\/operator-overloading-friends\/\">Next: Operator Overloading &amp; friends<\/a><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>this &amp; Temporary Objects Here is the next stage of our saga about C++ classes&#8230; The this Pointer When you invoke a (non-static) class member function: within the member function, there is available a pointer called this. The this pointer for a class T is implicitly defined as: (later, we\u2019ll see cases where this changes) [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1901,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-924","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/pages\/924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/comments?post=924"}],"version-history":[{"count":23,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/pages\/924\/revisions"}],"predecessor-version":[{"id":1916,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/pages\/924\/revisions\/1916"}],"up":[{"embeddable":true,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/pages\/1901"}],"wp:attachment":[{"href":"https:\/\/bhiggs.x10hosting.com\/PracticalCPlusPlusProgramming\/index.php\/wp-json\/wp\/v2\/media?parent=924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}