c++ 抽象概念,内存格局,浅拷贝,深拷贝,临时对象,无名对象

时间:2020-12-06 19:49:48

抽象:抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程

数据抽象:描述某类对象的属性或状态,(对象相互区别的物理量)

代码抽象:描述某类对象的共有的行为特征或具有的功能

抽象的实现:通过类的声明。

内存格局通常分为四个区:

c++ 抽象概念,内存格局,浅拷贝,深拷贝,临时对象,无名对象

new和delete:

malloc和free需要在头文件中申明,而new和delete则不需要头文件

new对象会自动调用构造函数,delete自动调用析构函数

拷贝构造函数:

当需要一个对象去构造另一个对象时,需要拷贝构造函数。

拷贝构造函数的参数必须是一个引用。传值的方式会调用该类的拷贝构造函数,从而造成无穷递归的调用拷贝构造函数。

当没有拷贝构造函数时,系统会自动定义一个拷贝构造函数。当析构函数需要析构资源时候,拷贝构造函数需要深拷贝。

浅拷贝:

#include<iostream>
using namespace std;
class A
{
    private:
	int m_data;
    public:
	A(int x)
	{
	    m_data=x;
	}
	A(const A& y)      <span style="color:#ff0000;">   //浅拷贝构造函数</span>
	{
	    m_data=y.m_data;
	}
	void show()
	{
	    cout<<m_data<<endl;
	}

};

int main()
{
    A a1(5);
    A a2(a1);
    a2.show();    <span style="color:#ff0000;"> // 显示为5;</span>
    return 0;

}

深拷贝:

#include<iostream>
#include<string.h>
using namespace std;
class A
{
    private:
	int m_data;
	char *string;
    public:
	A(int x,const char* str) <span style="color:#ff0000;">//构造函数</span>
	{
	    m_data=x;
	    string=new char[strlen(str)+1];    
	    if(string!=0)
	    {
		strcpy(string,str);
	    }
	}
	A(const A& y) <span style="color:#ff0000;">//拷贝构造函数</span>
	{
	    m_data=y.m_data;
	    string=new char[strlen(y.string)+1];  <span style="color:#ff0000;">//深拷贝,申请资源</span>
	    if(string!=0)
	    {
		strcpy(string,y.string);
	    }

	}
	~A()      <span style="color:#ff0000;"> //此时必须手动建立析构函数来释放资源</span>
	{
	    delete string;
	}
	void show()
	{
	    cout<<"m_data:"<<m_data<<"string:"<<string<<endl;
	}

};

int main()
{
    A a1(5,"hello world");
    A a2(a1);
    a2.show();  <span style="color:#ff0000;">//m_data:5 string:hello world</span>
    return 0;

}


临时对象:

临时对象通常产生于以下情况:

1:类型转换    // fn("Jenny") 相当于fn(student("Jenny"));

2:按值传递

3:按值返回

4:对象定义


student fn()
{
    student ms("Randy"); <span style="color:#ff0000;">//系统调用拷贝函数,将ms拷贝到新创建的临时对象</span>
    return ms;   
}
void main()
{
    student s;
    s=fn();  <span style="color:#ff0000;">//创建临时对象,在整个创建它们的外部表达式范围内有效,当fn()返回时阐释的临时对象拷贝给s后,临时对象就析构了。</span>
}

c++ 抽象概念,内存格局,浅拷贝,深拷贝,临时对象,无名对象

无名对象:

可以直接调用构造函数来产生无名对象。


class Student
{
    public:
	Student(char*);
	//.....
};
void fn()
{
    Student("Randy");  //此处为无名对象
}
无名对象也可以做为实参传递给函数,可以拿来拷贝构造一个新对象,也可以初始化一个引用的申明

void fn(Student& s);
int main()
{
    Student& refs=Student("Randy");  //初始化引用
    Student s=Student("Jenny");	     //初始化对象定义
    fn(Student("Danny"));	     //函数参数
}