首先,说说构造函数。构造函数的作用:无论构造函数隐式还是显式被调用,编译器都会生成代码生成一个对象,然后会用构造函数的初始化列表中的值初始化对象,初始化完毕行会执行构造函数体中的代码。
例如可以显式调用一个类的构造函数来生成该类的一个对象。
cout<<string("i love cpp"); //使用string类的构造函数产生一个string类的临时对象
===
编译器默认为类提供:空参数的构造函数,拷贝构造函数,赋值操作符operator=,析构函数。
如果程序员提供了构造函数(包括拷贝构造函数),编译器将不再生成零参数的构造函数。
如果程序员显式实现了拷贝构造函数,那么编译器将不再生成,成员变量拷贝工作,全部由程序员来负责。
如果程序员实显式实现了类的operator=,那么系统将不在自动生成,成员变量的赋值工作,全部由程序员来负责。
如果程序员自己实现了析构函数,那么编译器将不再自动生成。
一个好的编程习惯是:任何时候都自己去显式提供零参数的构造函数。
===
如果程序员没显式的自定义一个复制构造函数,赋值操作符或析构函数,编译器会生成这些未定义操作的默认版。默认版的函数定义为递归操作,即根据元素类型的适当规则、复制、赋值或者销毁数据。见《accerlated c++ 》p179.
class C
{
public:
C()
{
i = 77;
}
C(int init)
{
i = init;
}
int main() C c2(88);
C& operator=(const C & x)
{
}
int i;
};
{
C c1;
cout<<c1.i; //77
cout<<c2.i; //88
c1 = c2; //赋值操作,因为自己实现了,编译器将不再提供
cout<<c1.i; //注意,输出结果是77而不是88
}
本文详细解释了构造函数在C++中的作用及其如何初始化对象的过程。同时介绍了编译器默认提供的构造函数类型,以及当程序员自定义构造函数时编译器的行为变化。
5652

被折叠的 条评论
为什么被折叠?



