一、构造函数:
构造函数是一个特殊的、与类同名的成员函数,用于给每个成员设置适当的初始值。
-
构造函数不能有返回值,函数名为类名。
-
缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空。缺省构造函数是不带参数的。
-
创建一个对象时,系统自动调用构造函数。
总结:
1.构造函数可以重载
2.实参决定使用哪个构造函数
3.构造函数自动执行
4.构造函数不能声明为const // 如: Base( ) const;
注意:一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数了。这条规则根据是:如果一个类在某种情况下需要控制对象初始化,则该类很可能在所有情况下都需要控制。
例子:
默认构造函数:
Sales_item::Sales_item():units_sold(0),revenue(0.0){}
自定义构造函数:
Sale_item::Sale_item(int a,double b):units_sold(a),revenue(b){}
二、复制构造函数
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。
复制构造函数的定义与其他构造函数一样:它与类同名,没有返回值,可以(而且应该)使用构造函数初始化列表初始化新创建对象的成员,可以在函数体重做任何其他必要工作。
c++支持两种初始化形式:直接初始化和复制初始化。复制初始化使用=符号,而直接初始化将初始化式放在圆括号中(见于c++Primer P406)。
string a="123-123"; //复制初始化
string b(10,'.') // 直接初始化
string c=string(); //复制初始化
实例:
class Sales_item
{
private:
std::string isbn;
int units_sold;
double revenue;
};
Sale_item::Sales_item(const Sales_item & orig): isbn(orig.isbn),units_sold(orig.units_sold),revenue(orig.revenue)
{}
理解:
复制构造函数是一种特殊的构造函数!!
三、赋值操作符
Sales_item & Sale_item::operator=(const Sales_item &rhs)
{
isbn =rhs.isbn;
units_sold = rhs.units_sold;
revenue = rhs.revenue;
return *this;
}
类赋值操作符接受类类型形参,通常,该形参是对类类型的const引用,但也可以是类类型或对类类型的非const引用。
可以为一个类定义许多附加的赋值操作符。这些赋值操作符会因右操作数类型的不同而不同。
赋值操作符可以重载。
唯一一个有返回值的复制控制函数
四、析构函数
析构函数名字在类名字钱加个~(注意~和类名是一体的,不准分开),没有返回值,没有形参。因为不能指定任何形参,故不能重载析构函数。虽然可以给一个类定义多个构造函数,但是只能提供一个析构函数。
析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成析构函数仍然运行。
基类几乎总是需要析构函数,从而可以将析构函数设为虚函数。即使析构函数没有工作要做,继承层次的根类也应该定义一个虚析构函数。
五、调用构造函数、复制构造函数、赋值操作符、析构函数的例子如下:
new 调用构造函数
delete 调用析构函数
在定义的时候就调用构造函数(复制构造函数属于构造函数的一种,这种情况下,要创建新对象)
已经定义好了就调用赋值操作符(不必创建新对象)
#include <cstdlib>
#include <iostream>
#include<string>
using namespace std;
class Base
{
private:
string SName;
public:
Base(); // 默认构造函数
Base(string name):SName(name) // 自定义构造函数
{
cout<<"Define Constructor(自定义构造函数)"<<endl;
}
Base(Base & B1); // 复制构造函数
Base & operator=(const Base & B1); // 赋值操作符
string GainName() // 普通成员函数
{
return SName;
}
~Base(); // 析构函数
};
Base::Base()
{
//SName("abc");
string stmp("abc");
SName=stmp;
cout<<"Default Constructor(默认构造函数)"<<endl;
}
inline Base::Base(Base & B1):SName(B1.SName) // 定义为内联函数
{
cout<<"Copy Constructor Function(复制构造函数)"<<endl;
}
Base & Base::operator=(const Base & B1) // 唯一一个有返回值的复制控制函数
{
// Base b1 = new Base();
SName = B1.SName;
cout<<"Assignment Operator(赋值操作符)"<<endl;
return *this;
}
Base::~Base() // 自定义析构函数
{
cout<<"Destructor(析构函数)"<<endl;
}
int main(int argc, char *argv[])
{
string a("Hello");
Base *b5=new Base(a);
Base b6;
b6=(*b5); // b6是已经定义好的对象,“=” ,就需要赋值操作符。
cout<<b5->GainName()<<endl;
cout<<b6.GainName()<<endl;
Base *b1 = new Base("World");
Base b2 =(*b1); // 复制初始化 定义的时候初始化,都是复制构造函数。
Base b3(*b1); // 直接初始化 定义的时候初始化,都是复制构造函数
cout<<b1->GainName()<<endl;
cout<<b2.GainName()<<endl;
cout<<b3.GainName()<<endl;
delete b5;
delete b1;
//delete &b6;
//delete &b2;
//delete &b3; //delete必须要跟new对应,不是new出来的对象,就不要用delete
system("PAUSE");
return EXIT_SUCCESS;
}
执行结果:
Define Constructor(自定义构造函数)
Default Constructor(默认构造函数)
Assignment Operator(赋值操作符)
Hello
Hello
Define Constructor(自定义构造函数)
Copy Constructor Function(复制构造函数)
Copy Constructor Function(复制构造函数)
World
World
World
Destructor(析构函数)
Destructor(析构函数)
Destructor(析构函数)
Destructor(析构函数)
Destructor(析构函数)
请按任意键继续. . .