当前位置:网站首页>对象的动态建立和释放,赋值和复制
对象的动态建立和释放,赋值和复制
2022-04-23 05:48:00 【*陌上花开】
一、对象的动态建立和释放
利用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)普通构造函数在建立对象时被调用。
复制构造函数在用已有对象复制新对象时被调用。
版权声明
本文为[*陌上花开]所创,转载请带上原文链接,感谢
https://blog.csdn.net/swint_er/article/details/123431991
边栏推荐
猜你喜欢
【UDS统一诊断服务】一、诊断概述(3)— ISO 15765体系结构
大学概率论与数理统计知识点详细整理
Graduation project, viewing screenshots of epidemic psychological counseling system
7-21日错题涉及知识点。
1007 go running (hdu6808) in the fourth game of 2020 Hangzhou Electric Multi school competition
SQL sorts according to the specified content
Database - sorting data
Dynamic creation and release, assignment and replication of objects
[untitled] database - limit the number of returned rows
解决ArcGIS分区统计显示太多唯一值执行失败
随机推荐
破解滑动验证码
日志
The most practical chrome plug-in
PM2 deploy nuxt project
Log4j2跨线程打印traceId
The onnx model of yolov5 removes the transfer layer
用C语言实现重写strcmp等四个函数
Cf1427c the hard work of paparazzi
Robocode教程4——Robocode的游戏物理
爬虫效率提升方法
Uniapp encapsulates request
【UDS统一诊断服务】四、诊断典型服务(6)— 输入输出控制单元(0x2F)
MySQL groups are sorted by a field, and the first value is taken
函数的调用过程
爬取小米有品app商品数据
Rust: Tcp 服务器与客户端的一个简单例子
Cf515b drazil and his happy friends
爬取彩票数据
使用TransmittableThreadLocal实现参数跨线程传递
Rust的闭包类型(Fn, FnMut, FnOne的区别)