C++ 对象的赋值和复制 基本的

对象的赋值

如果对一个类定义了两个或多个对象,则这些对象之间是可以进行赋值,或者说,一个对象的值可以赋值给另一个同类的对象。这里所指的值是指对象中所有数       据的成员的值。对象之间进行赋值是“=”进行的,对象赋值的形式如下:

对象名1=对象名2;

#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,20,25),box2;
cout<<"1"<<box1.volume()<<endl;
box2=box1;
cout<<"1"<<box2.volume()<<endl;
return 0;
}

1.对象的赋值只对其中的数据成员赋值,而不能对成员函数赋值。赋值的过程是将一个对象的数据成员在存储空间的状态复制给另一个对象的数据成员的存          储空间。

2.类的数据成员中不可包括动态分配的数据,否则在赋值时可能出现严重的后果。

对象的复制

有时会需要用到多个完全相同的对象,所以需要复制。有时需要将对象在某一瞬间时的状态保留下来。这就是更需要复制。用一个已有的对象快速的复制出         多个完全相同的对象。如:

Box box2(box1);

其作用就是用已有的对象box1去克隆出新对象box2.

其一般形式为:类名  对象名2(对象1);在建立一个新对象时调用一个特殊的构造函数----复制构造函数,这个函数的形式如下:

Box::Box(const Box& b)

{

height=b.height;

width=b.width;

length=b.length;

}

复制构造函数也是构造函数,但是它只有一个参数,这个参数是本类的对象(不能是其他类对象)。此复制构造函数的作用就是将实参对象的各个数据成员值一一赋值给新的对象中对应的数据成员。

C++还提供了另一种语句来复制对象:  Box box2=box1;   其基本形式如下:

类名  对象名1=对象名2;

还可以进行多个对象的赋值:Box box2=box1,box3=box2;请与下面的定义语句作比较:

int a=4,b=a;这种形式看起来很直观,但是用起来很方便,但是其作用就是调用复制构造函数。

注意:赋值和复制的区别,对象的赋值是对已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行赋值。而对象的复制则是从无到有的建立一个对象,并使它与一个已有的对象完全相同(包括结构和值)。

普通构造函数与复制构造函数的区别:

1.在形式上,

类名(形参列表);                           //普通构造函数的声明,如Box(int h,int w,int len);

类名(类名 &对象名);                    //复制构造函数的声明,如Box(Box &b);

2.在建立对象时,实参类型不同。系统会根据实参的类型决定调用普通构造函数或复制构造函数。

Box  box1(12,15,16);     //实参为整数,调用普通的构造函数

Box box2(box1);           //实参是对象名,调用复制构造函数

3.在什么情况下被调用。

普通构造函数在程序中建立对象时被调用。

复制构造函数在已有对象复制一个新对象时被调用,一下3种情况需要克隆对象;

1.程序中需要建立一个对象,并用另一个同类的对象对她初始化

2.当函数的参数为类的对象时,在调用函数时需要将实参对象完整的传递给形参,也就是需要建立一个实参的拷贝,这就是按实参复制一个形参,系统是             通过调用复制构造函数来实现的,这样能保证形参具有和实参完全相同的值。

静态数据成员

静态数据成员是各个对象所共有,而不是只属于某个对象成员,所有对象都可以引用他们。静态数据成员在内存中仅仅占一份空间。每个对象都可以引用这个静态数据成员。静态数据成员的值对所有对象都是一样的。如果改变它的值,则在各个对象中的这个数据成员的值同时改变。

静态数据成员可以初始化,但是只能在类体外进行初始化。

int Box::height=10;                                  //表示对Box类中的数据成员初始化

数据类型  类名::静态数据成员名=初值;              不必在初始化语句中加static.不能用参数初始化表对数据成员初始化。像:

Box (int h,int w,int len):height(h){}这是不对的,height是静态数据成员。

静态成员函数

静态成员函数是类的一部分,但是不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“::”,如

Box::volume();也可以通过对象名调用成员函数,a.volume();但是这并不意味着此函数属于对象a的,而只是用a的类型而已。

记住:静态成员函数不属于对象,它与任何对象都是无关的,因此静态成员函数没有this指针。也就是说:非静态成员函数有this指针,而静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。静态成员函数可以直接引用本类中的静态数据成员。因为静态数据成员同样属于类的,可以直接引用。

并不是绝对不能访问本类中的非静态成员,只是不能进行默认访问,因此无法知道应该去找哪个对象,如果非要引用本类中的非静态成员,应该加对象和成员运算符“.”。  例如:cout<<a.width<<endl;

时间: 2024-10-11 21:57:04

C++ 对象的赋值和复制 基本的的相关文章

不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 对象的动态创建和释放 对象的赋值和复制 静态属性和静态函数 类模板 示例1.CppEmployee 类CppEmployee.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppEmployee { int Number; // 默认为 private private: // 以下都是

C++:对象的赋值和复制

3.6.1 对象赋值语句 如同基本类型赋值语句一样,同类型的对象之间也可以进行赋值,即一个对象的值可以赋给另一个对象.这里所指的对象的赋值是指对其中的数据成员赋值,而不对成员函数赋值.例如:A和B是同一类的两个对象,那么下述对象赋值语句 B=A: 就能把对象A的数据成员的值逐位复制给对象B //例3.24 对象赋值语句示例 #include<iostream> using namespace std; class Myclass{ public: void set(int i,int j) {

Python把同一个对象循环赋值给另外一个变量

Python把同一个对象循环赋值给另外一个变量,修改一个对象,其他对象也修改了 >>> row=['_'] * 3 >>> board = [] >>> for i in range(3): ... board.append(row) ... >>> row ['_', '_', '_'] >>> board [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']] &g

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表l1 = [1, 2, 3, 4, 5]# 对l2赋值l2 = l1print(l1)l2[0] = 100print(l1) 示例结果: [1, 2, 3, 4, 5][100, 2, 3, 4, 5] 可以看到,更改赋

一起学Java(二十六)----- 对象之间赋值

不积跬步,无以至千里:不积小流,无以成江海. Java语言基础 Java对象之间赋值 赋值是用等号运算符“ = ”进行的,在对对象进行“赋值”时,实际就是将句柄从一个地方复制到另一个地方.这意味着假若为对象使用“A = B”,那么A和B最终都会指向最初只有B才指向的那个对象.也就是说这个时候他们两个引用了同一块内存地址. class Number{ int i; } public class Test { public static void main(String[] args) { Numb

赋值、复制构造函数和构造函数 &amp; 异常安全的赋值

异常安全的赋值 需要注意,复制赋值和复制构造,相兼容. 赋值时候,要带上自检查.

为此时产生了新对象——temp),在复制2的时候

看过C程序的返回值得处理过程,我们不妨先推测一下C+的返回值处理过程:总体与C的返回过程类似,只不过在上图复制1中并不是直接执行“位逐次拷贝”,而是调用拷贝构造函数(因为此时产生了新对象——temp),在复制2的时候需要调用赋值运算符(因为此时没有新的对象产生).下面我们进行验证. class X { public: X() {cout<<"X()"<<endl;};< p=""> X(const X& x) http:/

java 反射实现不同对象相同属性值复制

1.此方法会过滤final字段 2.此方法会过滤对象字段 3.此方法会兼容同对象之间.不同对象之间属性值复制 package com.bin.design.util; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; import com.bin.des

含有对象的数组的复制(拷贝)或者clone

在jquery里,可以通过$extend(dst,src1,src2)来实现对象的合并和复制来生成一个新的对象 但是都是针对{}类型的对象 很多情况下,我们需要对[{},{},{}]类型的对象数组进行复制 一个简单的方法是,先将要复制的对象数组转换成json,然后利用eval变成对象 如下 var src = [{name:'dv'},{sex:'male'},{others:[{a:'a',b:'b'}]}]; //利用JSON.stringify 字符串对象数组 var jsonstr =