面向对象的四大特征: 抽象,封装,继承,多态
抽象:面向对象中的抽象,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。
封装:封装是面向对象放的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。
继承:特殊类的对象拥有其一般类的全部属性和服务,称作特殊类对一般类的继承。
多态:多态性是指在一般类中定以的属性和行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。
类的默认函数:构造函数,拷贝构造函数,赋值语句,析构函数,普通对象取地址,常对象取地址。
构造函数(Constructor):数据成员多为私有的,要对它们进行初始化。bicultural用一个公有函数来进行。同时这个函数应该且应该仅在定义对象时自动执行一次。
构造函数的特征:
1)函数名与类名相同;
2)构造函数无返回值类型说明;
3)程序运行时,当心的对象建立,该对象所属的类构造函数自动调用,在该对象生存期中也只调用一次;
4)可以重载,说明其中有多个构造函数,由不同的参数表区分,系统在自动调用时按照一般函数重载的规则选一个执行。
5)可以在类内定义,也可以在类外定义(返回值 类名::函数名(参数列表));
6)如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省(无参数,所有参数都是默认值)的构造函数:类名(void){};
构造函数的三个作用:构造对象,初始化对象,类型转换;
格式:
Test(int data = 0) : m_data(data) {}
拷贝构造函数(Copy Constructor):在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数成为拷贝构造函数。
格式 :
Test(const Test &t)
{ m_data = t.m_data;}
t为引用传递,是构造函数的对象;参数要采用引用传递,不然把一个帧识的类对象作为参数传递到拷贝构造函数,会引起无穷递归。
赋值语句:
例如: int a = 10; //初始化
int a; a = 10; //赋值 在类中 Test t1(t); 也是赋值
作用:
1)拿对象来初始化对象;
2)当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。这时要在内存新建立一个局部对象,并把实参拷贝到新的对象中。
3)当函数的返回值是类的对象,函数执行完成返回调用时使用。理由也是要建立一个临时对象中,在返回调用者。
所谓的return对象,实际上是调用拷贝构造函数把该对象的值考入到临时对象。如果返回的时变量,类似过程。
格式:
Test& operator=(const Test &t)
//Test& operator=(Test* const this, const Test &t)
{
if (this != &t) //根据地址判断是否是自己给自己赋值
{m_data = t.m_data;}
return *this;
}
析构函数:
格式:
~Test() {}
class Test
{
public:
Test(int data = 0) : m_data(data)
{
cout << “Creat Test Object:” << this << endl;
}
Test(const Test &t) //默认的也带有const
//Test(Test &t) //const 可以不要
//Test(Test t) //&不能不要, 因为引用可以不再开辟空间
{
m_data = t.m_data;
cout << “Creat Copy Test Object:” << this << endl;
}
Test& operator=(const Test &t) //为什么引用返回;有助于连等,即 t2 = t1 = t;
{
cout << "Asign : " << this << “=” << &t << endl;
if (this == &t)
return this;
m_data = t.m_data;
//cout << “” << this << endl;
return this;
}
~Test()
{
cout << “Free Test Object.” << this << endl;
}
public:
Test operator&() //普通对象取地址
{
return this; //t的地址 this表示当前对象的地址
}
const Test operator&()const //常对象取地址
{
return this;
}
public:
//void fun(Test * const this)
void fun()
{
cout << this << “:This is Test::fun()” << endl;
}
//void fun(const Test* const this)
void fun()const
{
cout << this << “:This is Test::fun()const” << endl;
}
private:
int m_data;
};
int main()
{
Test t; //构造函数
Test t1 = t; // 初始化 //Test t1(t); //拷贝构造函数
Test t2;
t2 = t1; //赋值语句
Test *pt = &t;
const Test t3;
const Test *pt1;
pt1 = &t3;
/*
Test t(100);
Test t1, t2;
t2 = t1 = t; //t2.operator=(t1.operator=(t));
*/
return 0;
}