标签:
构造函数是特殊的成员函数, 只要创建类类型的新对象, 都要执行构造函数. 构造函数的工作是保证每个对象的数据成员具有合适的初始值. 构造函数的名字与类名相同, 并且不能指定返回类型. 像其他任何函数一样, 它们可以没有形参, 也可以定义多个形参. 用一个例子来具体介绍.
<span style="font-size:14px;">class Sales_item
{
public:
Sales_item() : units_sold(0), revenue(0.0) { }
private:
std::string isbn; //国际标准书号
unsigned units_sold; // 销售的书量
double revenue; //收入
};</span>这个构造函数使用构造函数初始化列表来初始化units_sold和revenue成员. isbn成员由string的默认构造函数隐式初始化为空串.
每当创建一个Sales_item的对象时, 都会调用默认构造函数对数据成员初始化, 上述代码运行结果如图:
构造函数初始化列表以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟一个放在圆括号中的初始化表达式. 构造函数可以定义在类的内部或外部.构造函数初始化只在构造函数的定义中而不是声明中指定.
1.构造函数可以被重载
可以为一个类声明的构造函数没有限制,只要每个构造函数的形参表是唯一的. 为上述代码添加一个接受一个string实参构造函数
<pre name="code" class="cpp"><span style="font-size:14px;">#include <iostream>
#include <string>
using namespace std;
class Sales_item
{
public:
Sales_item() : units_sold(0), revenue(0.0) { }
Sales_item(const string& S);
void Display(); //显示数据成员
private:
string isbn; //国际标准书号
unsigned units_sold;// 销售的书量
double revenue; // 收入
};
void Sales_item:: Display()
{
cout<<"isbn: "<<isbn<<endl;
cout<<"units_sold: "<<units_sold<<endl;
cout<<"revenue: "<<revenue<<endl;
}
Sales_item::Sales_item(const string& S)
{
isbn=S;
units_sold=0;
revenue=0;
}
int main()
{
Sales_item A;
Sales_item B("haha");
cout<<"默认构造函数: "<<endl;
A.Display();
cout<<"带string形参的构造函数:"<<endl;
B.Display();
return 0;
}
</span>
2.实参决定使用哪个构造函数
3.构造函数自动执行
只要创建该类型的一个对象,编译器就运行一个构造函数.
4.构造函数不能声明为const
从概念上讲, 可以认为构造函数分为两个阶段执行: (1) 初始化阶段 (2)普通的计算阶段.
计算阶段由构造函数体中的所有语句组成.
不管成员是否在构造函数初始化列表中显示初始化, 类类型的数据成员总是在初始化阶段初始化. 初始化发生在计算阶段开始之前.
<span style="font-size:14px;">Sales_item::Sales_item(const string& S)
{
isbn=S;
units_sold=0;
revenue=0;
}
</span>
<span style="font-size:14px;">class X {
int i;
int j;
public:
X(int val) : j(val), i(j) {}
};</span>class Sales_item
{
public:
Sales_item( const std::string &book = " ") : ibsn(book), units_sold(0), revenue(0.0) {}
Sales_item( std::istream &is)
};
<span style="font-size:14px;">class Sales_item
{
public:
Sales_item( const std::string &book = " ") : ibsn(book), units_sold(0), revenue(0.0) {}
Sales_item( std::istream &is)
};</span><span style="font-size:14px;">class Sales_item
{
public:
explicit Sales_item( const std::string &book = " ") : ibsn(book), units_sold(0), revenue(0.0) {}
explicit Sales_item( std::istream &is)
};</span>标签:
原文地址:http://blog.csdn.net/nizhannizhan/article/details/46315981