1、对象间的赋值

/***A.h文件***/
#pragma once
class A
{
public:
int va;
A(void);
A(char* name);
A(const A& a);
virtual void print();
char* name;
void setVa(int va){
this->va = va;
}
public:
~A(void);
};
/****A.cpp文件******/
#include "StdAfx.h"
#include "A.h"
#include <iostream> using namespace std; A::A(void)
{
cout<< "a constructor is invoked .." << endl;
this->va = ;
} A::A(char* name)
{
this->name = name;
cout<< "constructor of object of Class A, whose name is " << name << " , is invoked .." << endl;
} A::~A(void)
{
cout<< "a[name is "<< name <<"] is destroy .." << endl; } A::A(const A& a){
//cout<< "a[name="<< this->name <<"] copy constructor is invoked.." << endl;
cout<< "A copy constructor is invoked.." << endl;
this->name = a.name;
this->va = a.va;
} void A::print(){
cout << "this is a" << endl;
}

 
#pragma once
#include "a.h" class B :
public A
{ public:
int va;//在这里重新声明了va变量
B(char* name4A);
void print();
static int i;
public:
~B(void);
};
#include "StdAfx.h"
#include "B.h"
#include <iostream>
using namespace std; B::B(char * name4A):A(name4A)
{
this->setVa();
cout<< "b constructor is invoked .." << endl;
this->va = ;
} B::~B(void)
{
cout<< "b is destroy .." << endl;
} void B::print(){
cout << "this is B" << endl;
} int B::i = -;
// cplusplusprimer.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "A.h"
#include "B.h"
#include <iostream>
using namespace std; static int i;
int j ; int _tmain(int argc, _TCHAR* argv[])
{ A a("aSelf");
B b("aFromB");
//A a1("aSelf1"); cout<<"Hello C-Free!"<<endl; a.va = -;
b.va = -;
//a1.va = -3; cout<< "a.va=" <<a.va<<endl;
cout<< "b.va=" <<b.va<<endl; cout<< "*************************************" <<endl; a= b; a.name = "aSelf"; //下面的这条命令
//在这里你认为输出的值应该是什么呢
//你是不是认为输出的应该是-2,但事实上呢输出的是10,为什么呢?(问题1)
cout<<"a.va="<<a.va<<endl; cout<<"b.va="<<b.va<<endl; a.print(); cout<< "*************************************" <<endl; /************************************************************************/
/* 一般来说,变量(不管是普通变量,还是类成员变量)都需要初始化的,如果没初始化就使用了,可能会出现未知的错误
/************************************************************************/
cout<<"i="<<i<<endl;//静态变量系统会分配一个默认值给他
cout<<"j="<<j<<endl; /*
int q;
cout<<"j="<<q<<endl;//因为没有进行初始化,所以这里出错了
*/ cout<<"b.i="<<b.i<<endl; a.print();
return ;
}

关于以上面这段代码中注释里面提出的问题1,你能否解答呢.

在C++,每个类事实上都会默认对"="进行重写

operator=()

如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象。这里所指的对象的值是指对象中所有数据成员的值。

对象之间的赋值也是通过赋值运算符“=”进行的。本来,赋值运算符“=”只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的。

实际这个过程是通过成员复制来完成的,即将一个对象的成员值一一复制给另一对象的对应成员。

对象赋值的一般形式为
   对象名1 = 对象名2;
注意对象名1和对象名2必须属于同一个类。例如
Student stud1,stud2; //定义两个同类的对象

stud2=stud1; //将stud1赋给stud2 通过下面的例子可以了解怎样进行对象的赋值。
例9.9 对象的赋值。
#include <iostream>
using namespace std;
class Box
{
   public :
   Box(int =10,int =10,int =10); //声明有默认参数的构造函数
   int volume( );
   private :
   int height;
   int width;
   int length;
};
Box::Box(int h,int w,int len)
{
   height=h;
   width=w;
   length=len;
}
int Box::volume( )
{
   return (height*width*length); //返回体积
}
int main( )
{
   Box box1(15,30,25),box2; //定义两个对象box1和box2
   cout<<″The volume of box1 is ″<<box1.volume( )<<endl;
   box2=box1; //将box1的值赋给box2
   cout<<″The volume of box2 is ″<<box2.volume( )<<endl; return 0;
}
运行结果如下:
The volume of box1 is 11250
The volume of box2 is 11250 说明:
(1) 对象的赋值只对其中的数据成员赋值,而不对成员函数赋值。
(2) 类的数据成员中不能包括动态分配的数据,否则在赋值时可能出现严重后果。 注:
1、如果是子类对象给父类对象赋值,那么子类对象只会把从父类那边继承过来的数据成员赋值给父类对象成员
的数据成员。
2、如果子类重写了父类的数据成员,例如该数据成员为member,那么子类对象将拥有两份member数据成员
这也解释了问题1那里输出的是10,而不是-2。当子类对象赋值给父类对象时,对于被重写了的数据成员如何赋值给父类对象对应的数据成员.
也就是子类对象要选择哪个数据成员给相对应的父类数据成员呢? 答案是:子类对象在构造时它同时也会构造一个父类对象x,这些对象x所对应的数据成员member
将被赋值给对应的父类对象的数据成员。

C++ 对象间的赋值与拷贝构造函数的更多相关文章

  1. C# 便捷实现可迭代对象间的赋值

    目录 都是迭代,为啥我一定要用foreach 如果换成是字典呢? 关于 foreach 都是迭代,为啥我一定要用foreach ​ 问题起源于本人的一个练手的扑克牌程序:洗完牌之后要发给场上的三人. ...

  2. PoEdu - C++阶段班【Po学校】- Lesson03-4_构造函数&赋值函数&拷贝构造函数&学习方式 - 第6天

    PoEdu - C++阶段班[Po学校]- 第6天 课堂选择题目: 1  关于转换构造函数  ClassDemo demo = 1;  调用转换构造函数 2  关于拷贝赋值函数  demo =2; 首 ...

  3. c++怎样让返回对象的函数不调用拷贝构造函数

    我们知道拷贝构造函数有两种“默默”的方式被调用 1. 想函数传入 值参数 2. 函数返回 值类型 今天我们讨论函数返回值类型的情况. 得到结论是 1. 当对象有拷贝构造函数(系统为我们生成.或者我们自 ...

  4. C++ 函数返回对象时并没有调用拷贝构造函数

    #include <iostream> #include <vector> #include <string.h> using namespace std; cla ...

  5. C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现

    指针悬挂: 问题:使用new申请的内存内存空间无法访问,也无法释放. 原因:直接对指向new申请的存储空间的指针变量进行赋值修改 后果:失去了原来的地址,原来的空间无法访问也无法释放,造成内存泄漏 还 ...

  6. C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转

    对于一个空类,编译器默认产生4个成员函数:默认构造函数.析构函数.拷贝构造函数和赋值函数.1.构造函数:构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存. ...

  7. C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  8. C++中的构造函数,拷贝构造函数,赋值函数

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  9. C++ 拷贝构造函数和赋值构造函数

    转自:http://blog.chinaunix.net/uid-28662931-id-3496326.html 一.拷贝构造函数 int main(int argc, char * argv[]) ...

随机推荐

  1. 盗取cookie终极代码

    大家知道xss攻击最有效的方式就是盗取cookie值.通过盗取cookie值可以进入后台从法客搬过来的~ JS: document.write('<script LANGUAGE="J ...

  2. Python 2.7.9 Demo - 003.01.只允许相同缩进

    Right #!/usr/bin/python if True: print ("True"); print('Again'); else: print ("False& ...

  3. Oracle PLSQL Demo - 18.02.管道function[查询零散的字段组成list管道返回] [字段必须对上]

    --PACKAGE CREATE OR REPLACE PACKAGE test_141215 is TYPE type_ref IS record( ENAME ), SAL )); TYPE t_ ...

  4. Linux五种I/O模型性能分析

    转载自:http://blog.csdn.net/jay900323/article/details/18141217/ socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理 ...

  5. 使用Supervisor管理Linux进程

    使用Supervisor管理Linux进程 简介 Supervisor是一个C/S系统,它可以在类UNIX系统上控制系统进程,由python编写,提供了大量的功能来实现对进程的管理. 安装 sudo ...

  6. java图片截取组件ImageIO

    引用:http://blog.csdn.net/cdl2008sky/article/details/7775681 javax.imageio使用 ImageIO 类的静态方法可以执行许多常见的图像 ...

  7. Python+Django+SAE系列教程12-----配置MySQL数据库

    由于SAE上支持的是Mysql,首先我们要在本地配置一个Mysql的环境 ,我在网上找到MySQL-python-1.2.4b4.win32-py2.7.exe,并双击 安装 选择典型安装 安装结束后 ...

  8. C语言 · 成绩的等级输出

    输入一个百分制的成绩t后,按下式输出它的等级.等级为:90~100为A,80~89为B,70~79为C,60~69为D,0~59为E. 样例输入 98 样例输出 A   #include<std ...

  9. [mmc]Linux下MMC/SD/SDIO的识别与操作

    转自:http://blog.csdn.net/skdkjzz/article/details/38927943 我们知道host在扫描卡的过程中,其识别的顺序为SDIO  SD MMC,并且从它的注 ...

  10. 文件服务器和web应用分离的思路(转)

    目前在做一个应用,有不同的客户端,包括web应用的客户端,其他的客户端,都要访问我的文件服务器,通过文件服务程序提供的服务来访问文件,但是对文件管理服务器这个应用,没有什么思路,请大家给点思路,谢谢: ...