类与对象
对象的创建与销毁
构造函数
-
函数名与类名相同,无返回类型返回值
-
对象在创建的时候会调用构造函数,用以完成数据成员的初始化
-
构造函数不能通过对象以.的方式调用
-
默认情况下编译器生成无参构造函数,如果已经自定义构造函数则不会生成无参构造函数,显然构造函数可以进行重载
-
String str;
(创建String类对象)
-
String str();
(声明一个空参返回string的函数)
初始化表达式
-
每个数据成员初始化顺序由被声明时的顺序决定,与其在初始化列表中顺序无关
(先执行默认初始化后,再在函数体中执行赋值操作。错误的顺序会初始化出错)
-
:_brand( new char[strlen(brand) +1]( ) ) ,_price(price)
-
strcpy(_brand, brand);
(不能使用sizeof,开出的空间大小可能不够)
析构函数
-
完成数据成员的清理工作
-
一个类只有唯一一个析构函数,不可重载
-
析构函数可以通过.成员函数调用,但是不建议显式调用,可能发生意料之外的事情
-
默认情况下,编译器自动生成析构函数
-
delte[ ] _brand; _brand = nullptr;
(对于堆空间需要手动回收)
析构函数调用时机
- 对于全局定义的对象,每当程序开始运行,在主函数main 接受程序控制权之前,就调用构造函数创建全局对象,整个程序结束时,自动调用全局对象的析构函数。
- 对于局部定义的对象,每当程序流程到达该对象的定义处就调用构造函数,在程序离开局部对象的作用域时调用对象的析构函数。
- 对于关键字static 定义的静态局部变量,当程序流程第一次到达该对象定义处调用构造函数,在整个程序结束时调用析构函数。
- 对于用new 运算符创建的对象,每当创建该对象时调用构造函数,当用delete 删除该对象时,调用析构函数。
(~是按位取反,全反!是逻辑取反表示0与0非0)
代码示例
class Point{
public:
Point(int ix,int iy)
: _ix(0)//初始化表达式(初始化列表)
, _iy(0)//初始化
{//构造函数
cout<<"Point(int,int)"<<endl;
_ix=ix;//赋值
_iy=iy;//赋值
}
Point(){//默认无参构造函数
}
void print(){
cout<<"("<<_ix<<","<<_iy<<")"<<endl;
}
~Point(){//析构函数
cout<<"~Point()"<<endl;
}
private:
int _ix;
int _iy;
}
Point::Point(){
}
Point::~Point(){
}