`
kmplayer
  • 浏览: 506516 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款16:在opeartor=中为所有的data members赋值内容

 
阅读更多
1,先看一个错误的情况:
class Base
{
public:
  Base(int initialValue = 0): x(initialValue) {}
private:
  int x;
};
class Derived: public Base
{
public:
  Derived(int initialValue)
  : Base(initialValue), y(initialValue) {}
  Derived& operator=(const Derived& rhs);
private:
  int y;
};


Derived& Derived::operator=(const Derived& rhs)
{
  if (this == &rhs) return *this;   
  y = rhs.y;                       
  return *this;                   
}

那么执行下面的代码:
void assignmentTester()
{
  Derived d1(0);                      // d1.x = 0, d1.y = 0
  Derived d2(1);                      // d2.x = 1, d2.y = 1
  d1 = d2;       // d1.x = 0, d1.y = 1!
}
注意:d1的base成分并未因assignment动作而改变内容.

正确的做法:
Derived& Derived::operator=(const Derived& rhs)
{
  if (this == &rhs) return *this;
  Base::operator=(rhs);    // call this->Base::operator=
  y = rhs.y;
  return *this;
}

3,复制构造函数存在一样的问题:

class Base
{
public:
  Base(int initialValue = 0): x(initialValue) {}
  Base(const Base& rhs): x(rhs.x) {}
private:
  int x;
};
class Derived: public Base
{
public:
  Derived(int initialValue)
  : Base(initialValue), y(initialValue) {}
  Derived(const Derived& rhs)     
  : y(rhs.y) {}             // 这里基类成分,采用默认构造函数
private:
  int y;
};

为了避免这一问题,派生类的copy constructor必须确保调用基类的copy constructor
class Derived: public Base
{
public:
  Derived(const Derived& rhs): Base(rhs), y(rhs.y) {}
  ...
};
分享到:
评论

相关推荐

    深入理解Android中的xmlns:tools属性

    因此为了在ide中预览效果,你必须在xml中为TextView控件设置android:text属性 <TextView android:id=@+id/text_main android:layout_width=match_parent android:layout_height=wrap_content android:...

    matlab命令大全

    - **功能**: 在特定的工作区中为变量赋值。 - **语法**: `assignin(ws,'var',value)` - **参数**: - `ws`: 工作区名称。 - `'var'`: 变量名称。 - `value`: 赋值给变量的值。 - **示例**: 使用 `assignin('base',...

    图文介绍mysql中:=和=的区别

    相比之下,`:=`是一个特定于MySQL的赋值运算符,主要用于在查询过程中为变量赋值。在`SELECT`语句中,`:=`可以用来在查询过程中动态地更新变量的值,这是`=`所不能做到的。例如,当你需要在结果集处理过程中计算行号...

    struts-logic iterate标签学习指南

    `id`属性则用于在迭代过程中为每个元素提供一个唯一的ID,以便于在页面上引用。 总之,Struts-Logic Iterate标签提供了强大的功能,使得在JSP页面上处理集合数据变得简单易行,是构建动态Web应用的重要工具。了解和...

    Android带动态效果的Button(按钮)

    本教程将深入探讨如何在Android中为Button添加动态效果,以提升用户体验和界面的吸引力。 首先,我们从基本的Button说起。在XML布局文件中,可以使用`<Button>`标签来创建一个按钮,例如: ```xml android:id="@...

    ManagingAudioWithSiriKit:Siri ==:crystal_ball:

    在Xcode中运行示例代码项目之前: 在开发人员门户中为com.example.apple-samplecode.ControlAudio.Shared创建一个应用程序组。 在开发人员门户中为com.example.apple-samplecode.ControlAudio创建一个应用程序ID,...

    安卓 为图片设置动画效果

    在本教程中,我们将探讨如何在安卓应用中为图片设置缩放、旋转、淡出和移动等多种动画效果。 首先,我们需要在项目的 res/anim 文件夹下创建一个新的 XML 文件,例如命名为 `test.xml`。这个文件将用于定义我们的...

    android textView 走马灯效果实例

    值得注意的是,走马灯效果仅在TextView的宽度小于其内容的宽度时生效。如果TextView的宽度足够显示所有文本,那么走马灯将不会滚动。因此,通常需要通过调整TextView的宽度或字体大小来确保走马灯效果能够正常工作。...

    完美实现多个textview 的跑马灯效果,外加各个textview的点击事件(用布局移动实现)

    1. **属性设置**:首先,我们需要在XML布局文件中为`TextView`设置`android:singleLine="true"`属性,使得文本单行显示。然后,通过`android:ellipsize="marquee"`激活跑马灯效果。最后,设置`android:focusable=...

    Vuejs在v-for中,利用index来对第一项添加class的方法

    在某些场景下,我们可能需要在循环中为特定元素添加特殊的CSS类,例如为列表的第一项添加`active`类。本文将详细解释如何在Vuejs的`v-for`中利用`index`来实现这一功能。 首先,`v-for`语法的基本形式如下: ```...

    Android中为EditText添加边框的代码清单.pdf

    在`res/drawable`目录下创建一个名为`bg_edt.xml`的文件,内容如下: ```xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> android:width=...

    自定义一个包含10个元素的一维int数组,并在声明语句中为其赋值;使用循环语句,随机选取该数组中的5个不重复的数据

    在C#编程中,创建一个包含10个元素的一维整型(int)数组并在声明时直接赋值是一项基本操作。接下来我们将深入探讨如何实现这一任务,以及如何使用循环语句和随机数生成来选取数组中的5个不重复的元素。 首先,让我们...

    grpc-dotnet-namedpipes:Windows在C#.NET中为gRPC命名管道传输

    GrpcDotNetNamedPipes Windows在C#/。NET中为命名管道传输。 这不是Google的官方产品。支持平台.NET Framework 4.6+(Windows) .NET Core 2.1+(Windows)用法假设您具有简介中的所述的Greeter服务。 服务器: var...

    Android中Button样式新方法

    在Android开发中,创建带有图标的按钮是一种常见的需求,这可以使用户界面更加直观且易于操作。传统的Button组件虽然可以直接设置背景图来实现图标与文字的结合,但有时我们需要更灵活的布局方式。本文将介绍一种...

    ripple-effect android eclipse 为控件增加涟漪效果

    如果你希望在所有版本的Android设备上实现涟漪效果,可以使用第三方库,如`android.support.v7.widget.AppCompatButton`,它提供了对`<ripple>`标签的兼容支持。在Eclipse中,你需要导入`appcompat-v7`库并使用兼容...

    scene.js:用于在浏览器中为图像序列和 spritesheet 设置动画的 JavaScript 库

    场景.js什么是 Scene.js Scene.js 是一个 JavaScript 库,用于在浏览器中为图像序列和 spritesheet 设置动画。 它允许您播放、暂停、播放动画和触发其他事件。入门入门相对容易。 您首先必须创建一个场景: var ...

    C++面试例题整理

    - 如果`y`和`z`均为非0值(在此例中为4),则表达式结果为1。 4. **按位或运算** (`|`):对两个二进制数的每一位进行或运算。 - 示例:`x = (y | z);` - 如果`y`和`z`均为4,则`y`和`z`的二进制形式为`00000100`...

    android 实现点击edittext的“小眼睛”切换明密文

    首先,我们需要在布局文件(如activity_main.xml)中为EditText添加一个切换按钮,通常是一个ImageView,作为“小眼睛”。这可以通过以下XML代码完成: ```xml android:id="@+id/et_password" android:layout_...

    Android中使用Dialog风格弹出框的Activity

    首先,为了将一个`Activity`设置为`Dialog`样式,我们需要在`AndroidManifest.xml`文件中为对应的`Activity`添加`android:theme`属性,并指定相应的主题。例如,我们可以使用`Theme.AppCompat.Dialog`或`Theme....

    activity设置背景透明

    然后在AndroidManifest.xml中为Activity指定这些动画: ```xml android:name=".YourActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowEnterAnimation="@anim/fade_in" ...

Global site tag (gtag.js) - Google Analytics