标签:
构造函数是特殊的成员函数, 只要创建类类型的新对象, 都要执行构造函数. 构造函数的工作是保证每个对象的数据成员具有合适的初始值. 构造函数的名字与类名相同, 并且不能指定返回类型. 像其他任何函数一样, 它们可以没有形参, 也可以定义多个形参. 用一个例子来具体介绍.
<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