• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/toolchains/hndtools-armeabi-2011.09/share/doc/arm-arm-none-eabi/html/gcc/
1<html lang="en">
2<head>
3<title>Copy Assignment - Using the GNU Compiler Collection (GCC)</title>
4<meta http-equiv="Content-Type" content="text/html">
5<meta name="description" content="Using the GNU Compiler Collection (GCC)">
6<meta name="generator" content="makeinfo 4.13">
7<link title="Top" rel="start" href="index.html#Top">
8<link rel="up" href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings" title="C++ Misunderstandings">
9<link rel="prev" href="Temporaries.html#Temporaries" title="Temporaries">
10<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
11<!--
12Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
131998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
142010 Free Software Foundation, Inc.
15
16Permission is granted to copy, distribute and/or modify this document
17under the terms of the GNU Free Documentation License, Version 1.3 or
18any later version published by the Free Software Foundation; with the
19Invariant Sections being ``Funding Free Software'', the Front-Cover
20Texts being (a) (see below), and with the Back-Cover Texts being (b)
21(see below).  A copy of the license is included in the section entitled
22``GNU Free Documentation License''.
23
24(a) The FSF's Front-Cover Text is:
25
26     A GNU Manual
27
28(b) The FSF's Back-Cover Text is:
29
30     You have freedom to copy and modify this GNU Manual, like GNU
31     software.  Copies published by the Free Software Foundation raise
32     funds for GNU development.-->
33<meta http-equiv="Content-Style-Type" content="text/css">
34<style type="text/css"><!--
35  pre.display { font-family:inherit }
36  pre.format  { font-family:inherit }
37  pre.smalldisplay { font-family:inherit; font-size:smaller }
38  pre.smallformat  { font-family:inherit; font-size:smaller }
39  pre.smallexample { font-size:smaller }
40  pre.smalllisp    { font-size:smaller }
41  span.sc    { font-variant:small-caps }
42  span.roman { font-family:serif; font-weight:normal; } 
43  span.sansserif { font-family:sans-serif; font-weight:normal; } 
44--></style>
45<link rel="stylesheet" type="text/css" href="../cs.css">
46</head>
47<body>
48<div class="node">
49<a name="Copy-Assignment"></a>
50<p>
51Previous:&nbsp;<a rel="previous" accesskey="p" href="Temporaries.html#Temporaries">Temporaries</a>,
52Up:&nbsp;<a rel="up" accesskey="u" href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings">C++ Misunderstandings</a>
53<hr>
54</div>
55
56<h4 class="subsection">11.8.4 Implicit Copy-Assignment for Virtual Bases</h4>
57
58<p>When a base class is virtual, only one subobject of the base class
59belongs to each full object.  Also, the constructors and destructors are
60invoked only once, and called from the most-derived class.  However, such
61objects behave unspecified when being assigned.  For example:
62
63<pre class="smallexample">     struct Base{
64       char *name;
65       Base(char *n) : name(strdup(n)){}
66       Base&amp; operator= (const Base&amp; other){
67        free (name);
68        name = strdup (other.name);
69       }
70     };
71     
72     struct A:virtual Base{
73       int val;
74       A():Base("A"){}
75     };
76     
77     struct B:virtual Base{
78       int bval;
79       B():Base("B"){}
80     };
81     
82     struct Derived:public A, public B{
83       Derived():Base("Derived"){}
84     };
85     
86     void func(Derived &amp;d1, Derived &amp;d2)
87     {
88       d1 = d2;
89     }
90</pre>
91 <p>The C++ standard specifies that &lsquo;<samp><span class="samp">Base::Base</span></samp>&rsquo; is only called once
92when constructing or copy-constructing a Derived object.  It is
93unspecified whether &lsquo;<samp><span class="samp">Base::operator=</span></samp>&rsquo; is called more than once when
94the implicit copy-assignment for Derived objects is invoked (as it is
95inside &lsquo;<samp><span class="samp">func</span></samp>&rsquo; in the example).
96
97 <p>G++ implements the &ldquo;intuitive&rdquo; algorithm for copy-assignment: assign all
98direct bases, then assign all members.  In that algorithm, the virtual
99base subobject can be encountered more than once.  In the example, copying
100proceeds in the following order: &lsquo;<samp><span class="samp">val</span></samp>&rsquo;, &lsquo;<samp><span class="samp">name</span></samp>&rsquo; (via
101<code>strdup</code>), &lsquo;<samp><span class="samp">bval</span></samp>&rsquo;, and &lsquo;<samp><span class="samp">name</span></samp>&rsquo; again.
102
103 <p>If application code relies on copy-assignment, a user-defined
104copy-assignment operator removes any uncertainties.  With such an
105operator, the application can define whether and how the virtual base
106subobject is assigned.
107
108 </body></html>
109
110