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[]) ...
随机推荐
- java.net.Socket/java.net.ServerSocket-TCP Socket编程
TCP 的 Java 支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP 协议族有 IP 协议.TCP 协议和 ...
- angular学习笔记(二十三)-$http(1)-api
之前说到的$http.get和$http.post,都是基于$http的快捷方式.下面来说说完整的$http: $http(config) $http接受一个json格式的参数config: conf ...
- csdn能不靠点谱啊
以前的时候在csdn上有一个博客,那时经常出错,所以就不用了,后来在百度上开了个博客,后以空间升级了,升级之后,那叫一个垃圾,不用了,现在返回头来再用csdn,刚开始两天还好,没用两天又不行了,想在上 ...
- LeetCode: isSameTree1 解题报告
isSameTree1 Given two binary trees, write a function to check if they are equal or not. Two binary t ...
- u-boot可ping通PC,PC不可ping通u-boot
http://blog.csdn.net/ce123_zhouwei/article/details/7339134 开发板运行U-Boot,在终端下使用Ping命令是能Ping通PC机,但PC机Pi ...
- oracle 字符集 AL32UTF8、UTF8
简介:ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,ORA ...
- linux 提示符绝对路径
# Turn on checkwinsize shopt -s checkwinsize [ "$PS1" = "\\s-\\v\\\$ " ] & ...
- iOS彩票项目--第六天,运用MVC思想搭建设置界面(非storyboard方法)
一.我只想说封装的思想很重要,MVC的思想也很重要,利用MVC思想搭建一下的界面 先说显示出来的cell,有三种(图中的两种,还有一种是最普通的,没有图片的),这种显示不同的cell,交给模型来处理, ...
- CSS(一):CSS简介和基本语法
一.CSS简介 1.什么是CSS CSS:Cascading Style Sheet:即层叠样式表.样式定义了如何显示HTML或XHTML元素.包括对字体.颜色.边距.高度.宽度.背景图片.网页定位等 ...
- scp基本使用方法
scp基本使用方法: scp用于在两台电脑之间进行数据的copy,形式如下: 第一种, scp [-r] 文件/文件夹 user@host:dir ,需要输入密码. 第二种, scp [-r] ...