抽象:抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程
数据抽象:描述某类对象的属性或状态,(对象相互区别的物理量)
代码抽象:描述某类对象的共有的行为特征或具有的功能
抽象的实现:通过类的声明。
内存格局通常分为四个区:
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")); //函数参数 }