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 = ;
} 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++ 对象间的赋值与拷贝构造函数的更多相关文章
- C# 便捷实现可迭代对象间的赋值
目录 都是迭代,为啥我一定要用foreach 如果换成是字典呢? 关于 foreach 都是迭代,为啥我一定要用foreach 问题起源于本人的一个练手的扑克牌程序:洗完牌之后要发给场上的三人. ...
- PoEdu - C++阶段班【Po学校】- Lesson03-4_构造函数&赋值函数&拷贝构造函数&学习方式 - 第6天
PoEdu - C++阶段班[Po学校]- 第6天 课堂选择题目: 1 关于转换构造函数 ClassDemo demo = 1; 调用转换构造函数 2 关于拷贝赋值函数 demo =2; 首 ...
- c++怎样让返回对象的函数不调用拷贝构造函数
我们知道拷贝构造函数有两种“默默”的方式被调用 1. 想函数传入 值参数 2. 函数返回 值类型 今天我们讨论函数返回值类型的情况. 得到结论是 1. 当对象有拷贝构造函数(系统为我们生成.或者我们自 ...
- C++ 函数返回对象时并没有调用拷贝构造函数
#include <iostream> #include <vector> #include <string.h> using namespace std; cla ...
- C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现
指针悬挂: 问题:使用new申请的内存内存空间无法访问,也无法释放. 原因:直接对指向new申请的存储空间的指针变量进行赋值修改 后果:失去了原来的地址,原来的空间无法访问也无法释放,造成内存泄漏 还 ...
- C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转
对于一个空类,编译器默认产生4个成员函数:默认构造函数.析构函数.拷贝构造函数和赋值函数.1.构造函数:构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存. ...
- C++中构造函数,拷贝构造函数和赋值函数的区别和实现
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...
- C++中的构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...
- C++ 拷贝构造函数和赋值构造函数
转自:http://blog.chinaunix.net/uid-28662931-id-3496326.html 一.拷贝构造函数 int main(int argc, char * argv[]) ...
随机推荐
- RednaxelaFX写的文章/回答的导航帖
https://www.zhihu.com/people/rednaxelafx/answers http://hllvm.group.iteye.com/group/topic/44381#post ...
- Rokid开发者社区skill之【历史上的今天】
技能名称:历史上的今天 入口词:打开历史上的今天 语音交互:(有些是先写上) { "intents": [ { "intent": "PAUSE_HI ...
- Java Callable并发编程模板
submit方法会产生Future对象,它用Callable返回结果的特定类型进行了参数化,可以用isDone()的方法来查询Future是否已经完成.当任务完成是,它具有一个结果,可以调用get() ...
- mysql 开启慢查询记录
Linux查看mysql 安装路径 一.查看文件安装路径 由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址). 这里以mysql为例.比如说我安装了mysql,但是不知道文件都安装 ...
- 基于java反射的javabean和map相互转换的工具类
话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...
- 【C#】获取泛型<T>的真实类型
需求:在包含泛型T的类或方法中,想要根据T的具体类型,进行相应的处理,需求伪代码如下: public void Test<T>() { if(T is string) { // do so ...
- 通过buildroot 移植 libsocketcan.so 以及 can 工具
进入buildroot make menuconfig Target packages ---> Networking applications ---> [*] can-utils // ...
- C++中的类继承之单继承&多继承&菱形继承
C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或 ...
- CodeIgniter(3.1.4)框架中添加执行时间统计代码
CodeIgniter(3.1.4)框架中添加,执行时间统计代码: system/core/CodeIgniter.php最后行处. /* * ---------------------------- ...
- font-face自定义字体
做网站的时候,有时候会遇到某些字体系统里面没有自带.可能更多的时候我们会选择以图替文的方式来做.用图片的话不利于图片的放大缩小,更好的办法是我们可以自定义字体. 当然,在实际运用中我们需要权衡一下自定 ...