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;
C++ 对象的赋值和复制 基本的的更多相关文章
- 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板
[源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...
- C++:对象的赋值和复制
3.6.1 对象赋值语句 如同基本类型赋值语句一样,同类型的对象之间也可以进行赋值,即一个对象的值可以赋给另一个对象.这里所指的对象的赋值是指对其中的数据成员赋值,而不对成员函数赋值.例如:A和B是同 ...
- C++中的对象的赋值和复制
对象的赋值 如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象.这里所指的对象的值是指对象中所有数据成员的值. 对象之间的赋值也是通过赋值 ...
- C++,对象的 =赋值 以及 复制构造函数赋值
1. C++默认实现了 = 号赋值:operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可. 2. C++默认实现了复制构造函数:同样,只要将一个对象的内容的内容逐位复制给另外一个对象 ...
- effective c++:对象的赋值运算
operator 中处理”自我赋值“ operator=操作符缺省情况下返回引用——TYPE& TYPE::operator=(const TYPE&),原因很简单,operator= ...
- Python把同一个对象循环赋值给另外一个变量
Python把同一个对象循环赋值给另外一个变量,修改一个对象,其他对象也修改了 >>> row=['_'] * 3 >>> board = [] >>& ...
- python 对象/变量&赋值的几点思考
python 对象/变量 对象 Every object has an identity, a type and a value. An object's identity never changes ...
- java数组对象的浅层复制与深层复制
实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.
- xml 转换成对象(采用反射机制对对对象属性赋值)
/// <summary> /// 采用反射机制对对对象属性赋值 /// </summary> /// <param name="node">& ...
随机推荐
- javascript之console篇
javascript中的console使用得当,将会事半功倍,对bug,性能等的跟踪,优化是个不错的利器! 1.基本日志消息打印: console.debug(msg); console.info() ...
- JS中for循环多个变量的判断原理
看完下面两个例子的比较就明白了,其实就是逗号表达式,总是依据最后一个表达式的值. for(i=0, j=0; i<10, j<6; i++, j++){ k = i + j; consol ...
- 关于Qt 报QDomDocument: No such file or directory错误解决办法
肯定是没有找到相关的路径,这时候只需要在.pro文件中加入便好了,比如我要用到读写xml的一些头文件,则需要在.pro中加入如下代码: 就可以正常引用了.
- python 将中文转拼音后填充到url做参数并写入excel
闲着没事写了个小工具,将中文转拼音后填充到url做参数并写如excel 一.先看下演示,是个什么东西 二.代码 代码用到一个中文转拼音的库,库是网上下的,稍微做了下修改,已经找不原来下载的地址了,然后 ...
- iOS实现图形编程可以使用三种API(UIKIT、Core Graphics、OpenGL ES及GLKit)
这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境.offscreen 位图环境和PDF图形环境,用来在屏幕表面.一个位图或一 ...
- Centos7安装gitlab服务器
1.先按照官方教程 https://about.gitlab.com/downloads/#centos7 大概内容如下: 1. Install and configure the necessary ...
- 《零压力学Python》 之 第一章知识点归纳
第一章(初识Python)知识点归纳 Python是从ABC语言衍生而来的 ABC语言是Guido参与设计的一种教学语言,为非专业编程人员所开发的. Python是荷兰程序员 Guido Van Ro ...
- 实验十二 团队作业8:软件测试与Alpha冲刺 第四天
项目 内容 这个作业属于哪个课程 老师链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 Always Run! 作业学习目标 (1)掌握软件测试基础技术 (2)学习 ...
- CodeForcesGym 100735D Triangle Formation
Triangle Formation Time Limit: Unknown ms Memory Limit: 65536KB This problem will be judged on CodeF ...
- Ajax 请求之_请求类型详解
$.ajax({ url: "规定发送请求的 URL.默认是当前页面.", type: "post", // 请求类型,默认get // 在回调函数中,无需将j ...