Copy-Assignment.html 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1988-2017 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <title>Using the GNU Compiler Collection (GCC): Copy Assignment</title>
  20. <meta name="description" content="Using the GNU Compiler Collection (GCC): Copy Assignment">
  21. <meta name="keywords" content="Using the GNU Compiler Collection (GCC): Copy Assignment">
  22. <meta name="resource-type" content="document">
  23. <meta name="distribution" content="global">
  24. <meta name="Generator" content="makeinfo">
  25. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings" rel="up" title="C++ Misunderstandings">
  30. <link href="Non_002dbugs.html#Non_002dbugs" rel="next" title="Non-bugs">
  31. <link href="Temporaries.html#Temporaries" rel="prev" title="Temporaries">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.smallquotation {font-size: smaller}
  36. div.display {margin-left: 3.2em}
  37. div.example {margin-left: 3.2em}
  38. div.indentedblock {margin-left: 3.2em}
  39. div.lisp {margin-left: 3.2em}
  40. div.smalldisplay {margin-left: 3.2em}
  41. div.smallexample {margin-left: 3.2em}
  42. div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style:oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nocodebreak {white-space:nowrap}
  54. span.nolinebreak {white-space:nowrap}
  55. span.roman {font-family:serif; font-weight:normal}
  56. span.sansserif {font-family:sans-serif; font-weight:normal}
  57. ul.no-bullet {list-style: none}
  58. -->
  59. </style>
  60. </head>
  61. <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
  62. <a name="Copy-Assignment"></a>
  63. <div class="header">
  64. <p>
  65. Previous: <a href="Temporaries.html#Temporaries" accesskey="p" rel="prev">Temporaries</a>, Up: <a href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings" accesskey="u" rel="up">C++ Misunderstandings</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  66. </div>
  67. <hr>
  68. <a name="Implicit-Copy_002dAssignment-for-Virtual-Bases"></a>
  69. <h4 class="subsection">13.7.4 Implicit Copy-Assignment for Virtual Bases</h4>
  70. <p>When a base class is virtual, only one subobject of the base class
  71. belongs to each full object. Also, the constructors and destructors are
  72. invoked only once, and called from the most-derived class. However, such
  73. objects behave unspecified when being assigned. For example:
  74. </p>
  75. <div class="smallexample">
  76. <pre class="smallexample">struct Base{
  77. char *name;
  78. Base(char *n) : name(strdup(n)){}
  79. Base&amp; operator= (const Base&amp; other){
  80. free (name);
  81. name = strdup (other.name);
  82. }
  83. };
  84. struct A:virtual Base{
  85. int val;
  86. A():Base(&quot;A&quot;){}
  87. };
  88. struct B:virtual Base{
  89. int bval;
  90. B():Base(&quot;B&quot;){}
  91. };
  92. struct Derived:public A, public B{
  93. Derived():Base(&quot;Derived&quot;){}
  94. };
  95. void func(Derived &amp;d1, Derived &amp;d2)
  96. {
  97. d1 = d2;
  98. }
  99. </pre></div>
  100. <p>The C++ standard specifies that &lsquo;<samp>Base::Base</samp>&rsquo; is only called once
  101. when constructing or copy-constructing a Derived object. It is
  102. unspecified whether &lsquo;<samp>Base::operator=</samp>&rsquo; is called more than once when
  103. the implicit copy-assignment for Derived objects is invoked (as it is
  104. inside &lsquo;<samp>func</samp>&rsquo; in the example).
  105. </p>
  106. <p>G++ implements the &ldquo;intuitive&rdquo; algorithm for copy-assignment: assign all
  107. direct bases, then assign all members. In that algorithm, the virtual
  108. base subobject can be encountered more than once. In the example, copying
  109. proceeds in the following order: &lsquo;<samp>val</samp>&rsquo;, &lsquo;<samp>name</samp>&rsquo; (via
  110. <code>strdup</code>), &lsquo;<samp>bval</samp>&rsquo;, and &lsquo;<samp>name</samp>&rsquo; again.
  111. </p>
  112. <p>If application code relies on copy-assignment, a user-defined
  113. copy-assignment operator removes any uncertainties. With such an
  114. operator, the application can define whether and how the virtual base
  115. subobject is assigned.
  116. </p>
  117. </body>
  118. </html>