上篇随笔中提到构造函数的介绍,这篇来深究一下.
构造函数名与类名一致.
构造函数的工作室保证每个对象的数据成员具有合适的初始值.例书店书籍构造体
class Sales_item{
public:
bool same_isbn(const Sales_item &rhs) const //判断两书的isbn是否相同.
{ return isbn == rhs.isbn; }
explicit Sales_item(const std::string &book):
isbn(book), units_sold(0), revenue(0.0){}
explicit Sales_item(std::istream &is);
private:
std::string isbn;
unsigned int units_sold;
double revenue;
};
一,构造函数可被重载
Sale_item(const std::string &book): 初始化数据 {};
Sale_item(std::istream &is);
Sale_item();
均为构造函数,使用时根据传入实参来决定使用哪个函数.
需要创建该类型的对象,编译器就会运行一个构造函数
二,构造函数初始化式
① Sale_item(): 初始化列表(初始化阶段) {(普通的计算阶段)}
在普通的计算阶段进行对数据成员赋值可达同样效果,但是.......
没有默认构造函数的类类型的成员 & const数据成员 & 引用类型成员
这三种数据成员都必须在初始化列表中进行初始化.
②按初始化次序初始化
Sale_item(int val):j(val), i(j) {}
这种有先后传递关系的初始化必须按照初始化顺序排列;
③,默认构造函数
只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数
(包括定义了非空参数构造函数,编译器都不会合成默认构造函数)
Sale_item myobj = Sale_item();
创建并初始化一个类对象用来初始化myobj.
三,隐式类类型转换,显式使用构造函数.
①隐式类类型转换
调用成员函数same_isbn(const Sale_item &rhs)时,函数期待一个Sale_item类型的形参,
若此时传入字符串"9-999-99999-9". 即myobj.same_isbn("9-999-99999-9");
编译器使用一个接受一个 string 的 Sale_item 构造函数从字符串生成一个新的 Sale_item 对象(临时的)
传给 same_isbn 函数. 这个行为称为隐式类类型转换.
②显式使用构造函数
如篇头类中构造函数所示,于构造函数前添加 explicit ,则所产生的 Sale_item 对象在使用成员函数时的
隐式类类型转换将被抑制.
此时需要使用显式构造函数传递实参给函数 same_isbn() .即
myobj.same_isbn(Sale_item("9-999-99999-9"));
四,类成员的显式初始化
struct Data{ int ival ; char *ptr; };
Data val1 = { 0 , 0};
Data val2 = { 1024, "A string"};
显示初始化只需按类的数据成员的定义顺序来进行逐项初始化.
原文链接: https://www.cnblogs.com/boloyonghao/archive/2012/07/16/2593886.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/55417
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!