对象的动态建立和释放,赋值和复制

一、对象的动态建立和释放

利用new运算符可以动态地分配对象空间,delete运算符释放对象空间

动态分配对象的一般形式:

new 类名;

new运算符动态分配得到的对象是无名的,它返回一个指向新对象的指针的值,即所分配的内存单元的起始地址。程序通过这个地址可以间接访问这个对象,因此需要定义一个指向类的对象的指针变量来存放该地址。

类名 * 对象指针变量;

对象指针变量= new类名;
如: student *p;    p = new student;
在执行new运算时,如果内存不足,无法开辟所需的内存空间,C++编译器会返回一个0值指针(NULL)。因此,只要检测返回值是否为0,就可以判断动态分配对象是否成功,只有指针有效时才能使用对象指针。

当不再需要使用由new建立的动态对象时,必须用delete运算予以撤销
如: delete p;
注意:new建立的动态对象不会自动被撤销,即使程序运行结束也是如此,必须人为使用delete撤销。

#include<iostream>
using namespace std;
class Object
{
private:
	int value;
public:
	Object(int x = 0) :value(x) {}
	void Print()const { cout << value << endl; }
};
void fun()
{
	Object obja(20);//.stack
}
int main()
{
	Object objb(40);
	fun();
	Object* p = new Object(30);//new 1.申请空间 2.创建对象 3.返回创建好对象的地址  .heap
	p->Print();
	delete p;//不需要时delete
}

 Object *p = new Object[n];//一次构建多个对象时,必须有缺省构造函数,没有缺省构造函数,无法连续构建对象。(如果构造函数没有参数,或者构造函数的所有参数都有默认值,就可以称其为缺省构造函数。一个类中,只能有一个缺省构造函数。)

 

 

二、对象的赋值和复制

1>对象的赋值

如果一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值。

对象赋值的一般形式:

对象名1=对象名2;

关于对象赋值的说明:
1)对象的赋值只对其中的非静态数据成员赋值,而不对成员函数赋值。
2)对象的数据成员中不能包括动态分配资源的数据,否则在赋值时可能出现严重后果。

2>对象的复制

有时需要用到多个完全相同的对象,就可以用一个已有对象快速地复制出多个完全相同的对象。

对象复制的一般形式:

类名  对象名2 (对象名1);

 student stu2 (stu1) ;

在建立对象时调用一个特殊的构造函数—复制构造函数。如果用户未定义复制构造函数,则编译系统会自动提供一个默认的复制构造函数。

如: student stu2 (stu1) ;

对应的复制构造函数:

student::student(const student &stu)
{ 
    num=stu.num;
    name=stu.name;
    score =stu.score;
}
#include<stdio.h>
#include<iostream>
using namespace std;

class student
{
private:
	int num;
	string name;
	float score;
public:
	student(int n, string m, float s) :num(n), name(m), score(s){};
	student(const student& stu);
	void display()
	{
		cout << "num:" << num << endl;
		cout << "name:" << name << endl;
		cout << "score:" << score << endl;
	}
};
student::student(const student&stu)//复制构造函数
{
	num = stu.num;
	name = stu.name;
	score = stu.score;
}
int main()
{
	student stu1(2020, "zhangsan", 85);
	student stu2(stu1);//复制
	stu1.display();
	stu2.display();
	return 0;
}

C++还提供了另一种方便用户使用的复制形式——用赋值号代替括号
对象复制的一般形式:
类名  对象名2 = 对象名1;

对象的赋值和对象的复制区别:
1)对象的赋值是对一个已经存在的对象赋值,必须先定义被赋值的对象,才能进行赋值。
2)如果对象的复制是建立个新对象,并使它与一个已有对象完全相同。

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

1)声明形式上不同。

类名 (形参列表)

类名 (类名 &对象名)
如: student( int num, string name, int score);
      student (student &stu);
2)建立对象时,实参类型不同。
如: student stu1( 20060102,“张三”,86 );
      student stu2( stu1);

3)普通构造函数在建立对象时被调用。

复制构造函数在用已有对象复制新对象时被调用。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值