C++类与对象
构造函数
所谓构造函数其实就是初始化对象的一个函数
每个对象在创建时都会自动调用构造函数,如果你没有定义,就会调用系统默认的构造函数。
构造函数的函数名与类名相同
构造函数无返回类型(void也不可以)
在对象创建时由系统自动调用,构造函数的访问属性为public。
class A{
private: int i;
public : A(){
cout<<"调用无参构造函数"<<endl;
}
A(int a){
i=a;
cout<<"调用有参构造函数"<<endl;
}
A(int a=1){
i=a;
cout<<"调用带默认参数的构造函数"<<endl;
}
A(int a,int b){
i=a;
cout<<"调用有参重载构造函数"<<endl;
}
};
构造函数可以是内联函数、重载函数、带默认形参值的函数
拷贝构造函数
拷贝构造函数是一个特殊的构造函数。当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现数据成员的拷贝。
调用拷贝构造函数的三种情况
1)当用类的一个对象去初始化类的另一个对象时。
Point B(A)//Point B =A
2)若函数的形参是类的对象,调用函数时,进行形参与实参的结合时。
void fun (Point A)
3)当函数的返回值是类对象时,函数执行完成返回调用者时。
Point fun()
第三种情况可能会因为编译器不同有所差别
含拷贝构造函数的类定义:
class 类名
{ public :
类名(形参);
类名(类名 &对象名);//拷贝构造函数
//(一般在此处用常引用 防止修改数据)
...
};
类名:: 类名(类名 &对象名)//拷贝构造函数的实现
{ 函数体 }
为了在调用过程中保护实参对象的数据安全,常常将形参对象的引用加const。
一般情况下,仅仅是通过拷贝构造函数初始化一个新对象,则隐含的拷贝构造函数即可完成,即自定义的构造函数可以省略。
**但是,**若类中包含指针类型的数据成员时,默认的拷贝构造函数会产生指针悬挂问题。
简单举例就是在执行析构函数时,一个指针变量会被析构2次。
析构函数
在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
(1)析构函数无参数、无返回值。
(2)只能有一个析构函数,即不能重载。
(3)析构函数的作用不是释放对象,而是系统释放对
象前的一些清理工作。
class A{
public:
A();//构造函数
~A();//析构函数
};
//外部定义
A::~A(){
函数体
}
构造函数和析构函数的调用次序
先构造的后析构,后构造的先析构。
参数初始化表形式
class A{
private: int i;
public:
A(int a):i(a){ }//{ }大括号不能少
};
from nuister kjr