您的位置:首页 > 编程语言 > C语言/C++

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

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

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

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

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

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

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>
}


无名对象:

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

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"));	     //函数参数
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: