C++ 对象间的赋值与拷贝构造函数
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 = 5; }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(10);cout<< "b constructor is invoked .." << endl;this->va = 3; }B::~B(void) {cout<< "b is destroy .." << endl; }void B::print(){cout << "this is B" << endl; }int B::i = -1;
// 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 = -1;b.va = -2;//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 0; }
关于以上面这段代码中注释里面提出的问题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 11250The volume of box2 is 11250 说明:(1) 对象的赋值只对其中的数据成员赋值,而不对成员函数赋值。(2) 类的数据成员中不能包括动态分配的数据,否则在赋值时可能出现严重后果。 注:1、如果是子类对象给父类对象赋值,那么子类对象只会把从父类那边继承过来的数据成员赋值给父类对象成员的数据成员。2、如果子类重写了父类的数据成员,例如该数据成员为member,那么子类对象将拥有两份member数据成员这也解释了问题1那里输出的是10,而不是-2。当子类对象赋值给父类对象时,对于被重写了的数据成员如何赋值给父类对象对应的数据成员.也就是子类对象要选择哪个数据成员给相对应的父类数据成员呢? 答案是:子类对象在构造时它同时也会构造一个父类对象x,这些对象x所对应的数据成员member将被赋值给对应的父类对象的数据成员。
C++ 对象间的赋值与拷贝构造函数相关推荐
- 返回对象1(未调用拷贝构造函数)
对象作为返回值与对象作为参数处理方法非常类似,对象作为参数时,进入函数前预先将对象使用的栈空间保留出来,并将实参对象中的数据复制到栈空间保留出来,并将实参对象中的数据复制到栈空间中.该栈空间作为函数参 ...
- 返回对象2(调用了拷贝构造函数)
文章目录 CMyString MyString=GetMystring() 触发拷贝构造函数原型 CMyString MyString=GetMystring() : 这里比较难理解的是,地址4011 ...
- C++中对象的赋值拷贝构造函数
目录 1.对象与对象之间的赋值. 下面给出代码说明赋值语句 对象赋值的限制和特点 2.拷贝构造函数 拷贝构造函数的特点 自定义的拷贝构造函数的代码及运行结果 默认拷贝构造函数 调用拷贝构造函数的3种情 ...
- 构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...
- string类的构造函数,拷贝构造函数,析构函数和赋值函数
String 类的原型如下 class String { public: String(const char *str=NULL); //构造函数 String(const String &o ...
- c/c++教程 - 2.4.2.1~2 对象的初始化和清理,构造函数和析构函数,构造函数的分类和调用(有参构造,无参构造,普通构造,拷贝构造,括号法,显示法,隐式转换法,匿名对象)
目录 4.2 对象的初始化和清理 4.2.1 构造函数和析构函数 4.2.2 构造函数的分类及调用 相关教程 4.2 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候 ...
- 构造函数、拷贝构造函数、赋值函数和析构函数
文章目录 一.构造函数 1.认识构造函数 2.初始化列表 二.拷贝构造函数 1.类对象的拷贝 2.浅拷贝和深拷贝 三.赋值函数 四.析构函数 1.认识析构函数 2.销毁,清理? 3.析构函数来阻止该类 ...
- C++ 拷贝构造函数和赋值构造函数
在C++中复制控制是一个比较重要的话题,主要包括复制构造函数.重载赋值操作符.析构函数这三部分,这三个函数是一致的,如果类需要析构函数,则它也需要复制操作符 和 复制构造函数,这个规则被称为 C++的 ...
- 基础备忘:拷贝构造函数和赋值函数
3.1 拷贝构造函数概述 现在我们来学习一种特殊的构造函数--拷贝构造函数. 对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同 ...
最新文章
- NVIDIA Display Container LS 服务意外地终止
- Deseq的理论基础
- Class.forName和ClassLoader
- 按规律插入一个数字到数组中
- 信息系统项目管理07——项目成本管理
- 翻车事故频发,原来是开发者漏了这一步!
- Catalyst 6000 family Architecture
- oracle停数据库服务器,优化Oracle停机时间及数据库恢复
- gcc/g++ 编译、链接与常用命令工具(1)
- mysql中innodb存储引擎在numa系统上的优化_MySQL中InnoDB存储引擎在NUMA系统上的优化...
- EDA技术实用教程 | 复习五 | 端口模式
- 朱松纯:AI 需由“心”驱动,实现“心”与“理”的动态平衡
- 华为认证双IE网络工程师,花了三天时间整理的OSPF详解,建议收藏
- 工业相机——点阵相机与线阵相机
- Windows API实现弹出U盘
- MacBook Pro 设置Finder显示隐藏文件
- java word转换pdf(先自定义添加水印 后转换pdf)通过 aspose-words
- 【BackEnd--SSM 框架详解】Mybatis+Spring+SpringMVC学习笔记(完整详细版)
- 用计算机弹起风了歌词,起风了歌词
- 03.Hadoop之HDFS
热门文章
- 惊!史上最佳GAN现身,超真实AI假照片,行家们都沸腾了
- 合作 | IEIC·IT耳朵智能创新大会:人工智能落地将带来新风口
- Hyperledger发布Burrow新版本,改进集成和开发体验
- 《R语言机器学习:实用案例分析》——1.3节使用函数
- httpd 服务的两个节点的HA
- JavaScript Ajax与Comet——“其他跨域技术”的注意要点
- HTTP之一:http协议简介(3)
- “TI门外汉”网路知识笔记四 单臂路由
- 修改 javascript 中alert样式
- pyqt5在mac os 安装