【C++primer】構(gòu)造函數(shù)
?#include <iostream>
using namespace std;
class Sales_data
{
public:
? ? Sales_data(std::string s) : bookNo(s)
? ? {
? ? } // 自定義構(gòu)造函數(shù)
? ? string bookNo;
? ? string str;
};
int main()
{
? ? Sales_data data2("hello");
}
調(diào)用構(gòu)造函數(shù),僅僅只是初始化了bookNo,但是str并沒有被初始化,但是通過單步調(diào)試,str被默認(rèn)初始化為空字符串(“”),也就是說:在創(chuàng)建data2對(duì)象的過程中,間接地調(diào)用了兩個(gè)不同類型的構(gòu)造函數(shù):一個(gè)是Sales_data的構(gòu)造函數(shù),另一個(gè)是std::string的默認(rèn)構(gòu)造函數(shù)。
那么就有個(gè)問題:既然調(diào)用了自己定義的構(gòu)造函數(shù)(Sales_data(std::string s) : bookNo(s)
),就不可能再調(diào)用默認(rèn)構(gòu)造函數(shù),這豈不是矛盾?
原因是:這是兩個(gè)不同類型的構(gòu)造函數(shù)。
當(dāng)我們創(chuàng)建一個(gè)Sales_data對(duì)象,比如Sales_data data2("hello");,我們實(shí)際上在調(diào)用Sales_data類的一個(gè)構(gòu)造函數(shù),那么就不能再調(diào)用Sales_data類的默認(rèn)構(gòu)造函數(shù),但是并不妨礙我們調(diào)用std::string的默認(rèn)構(gòu)造函數(shù)來初始化str

構(gòu)造函數(shù)是 :
?Sales_data(std::istream& is)
?{? ? ? ? ?read(is, *this);
?}
然后調(diào)用構(gòu)造函數(shù)構(gòu)造對(duì)象:
Sales_data total(cin);
this指針只能存在于member function中,當(dāng)調(diào)用構(gòu)造函數(shù)構(gòu)造對(duì)象(初始化對(duì)象)的時(shí)候,可以認(rèn)為是構(gòu)造函數(shù)正在作用于類對(duì)象(total),然后會(huì)把total的地址,即&total傳遞給this指針,所以this指向了total對(duì)象。