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. Azure Cloud Application Design and Implementation Guidance performance-optimization

    https://github.com/mspnp/azure-guidance https://github.com/mspnp/performance-optimization https://gi ...

  2. Android开发日记(二)

    HashMap<String, Object> map;定义一个HashMap用来传递字符 TextView textView_JobTitle=(TextView)findViewByI ...

  3. cjson库

    - 源码方式引用,只有两个文件- 标准C89编写 - [cJSON 库项目地址](https://github.com/DaveGamble/cJSON)

  4. mysql的OFFSET实现分页

    使用limit 可以实现分页比如 limit 0,5  是从1到5条, limit 5,5  是从,6到10条, 使用limit offset 时 limit 5 offset 0 从 1 到5 条 ...

  5. json demo

    package my.bigdata.movieTask.action; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.J ...

  6. 【Unity/C#】DateTime时间字符串,月份用英文显示

    制作一个钟表,要求效果如下图: 由于每一部分的字体大小不同,我分别使用了不同的Text控件.(不懂dalao们有没有更科学的办法) 把这些Text控件包含在一个Object下,给该Object定义一个 ...

  7. 在Window下安装解压版的mysql 5.7.11

    今天由于要在windows下学习Kettle,因此在Windows下安装了mysql 5.7.11,本来是没什么大问题的,但是在启动服务时还是出了点问题,服务老是启动不了: (一)解压到安装路径:   ...

  8. git 远程仓库版本的回退以及git reset 几种常用方式记录

    由于 github push 了两个比较潦草的commit, 自己很不满意,又不想重新开vpn进行上传,所以找了一下相关的教程. 最后研究了一下,原理为先在本地还原到你想要的commit,然后强制pu ...

  9. Hibernate使用createSqlQuery进行模糊查询时找不到数据

    1. 首先明确一点,使用createSqlQuery如下两种方式的占位符都可以使用,这个在官方的文档可以查到. 注意使用模糊查询时,赋值两边不可以添加单引号. Query query = sess.c ...

  10. Homebrew 的安装方法(官方的方法老师安装失败) 第三方

    官网:http://brew.sh/index_zh-cn.html 安装方式见 官网,在shell里执行如下语句,如下:ruby -e "$(curl -fsSL https://raw. ...