(1)对于一般的内建类型,这两种初始化基本上没有区别。
int a(5);//直接初始化
int a=5;//复制初始化
int a=int (5);//直接初始化
(2)当用于类类型对象时,初始化的复制形式和直接形式有所不同:
直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。
复制初始化首先使用指定构造函数创建一个临时对象,然后使用复制构造函数将那个临时对象复制到正在创建的对象。
//*******************************************************Account.h****************************************************************
#ifndef ACCOUNT_H
#define Account_H
#include <string>
class Account
{//一个简单的银行账户类
public:
enum accType{NUL = 0,PRV = 1,ENP = 2};//账户类型,非私有enum
Account& display(std::ostream &os);//显示账户
Account(const std::string &ow = ""):owner(ow),amount(0.0),actyp(NUL){} //带有默认实参的构造函数(含默认构造函数)
Account(const std::string &ow,double am,accType act)://带有三个形参的构造函数
owner(ow),amount(am),actyp(act){}
private:
std::string owner;//账户名
double amount;//余额
accType actyp;//账户类型
};
inline Account& Account::display(std::ostream &os)
{//输出账户信息
os << "Owner: "<<owner << " Amount: " << amount << " Type: " << actyp << std::endl;
return *this;
}
#endif
//*******************************************************main.cpp****************************************************************
#include <iostream>
#include <vector>
#include "Account.h"
using namespace std;
Account example(Account acc);
int main(void)
{
Account null_acc;直接初始化,直接调用默认构造函数
Account myacc("TLJ",500,Account::PRV);//直接初始化,直接调用与实参匹配的构造函数
myacc.display(cout);
Account test;
test = myacc;
Account null_account = string("");//或 ...= Account()//复制初始化,但不用复制构造函数,只用默认构造函数创建
null_account.display(cout);
Account err_account = string("####");//复制初始化,但不用复制构造函数,只用默认构造函数创建
err_account.display(cout);
Account same_acc = myacc;//复制初始化,调用复制构造函数 同Account same_acc(myacc),但如果复制构造函数声明为explicit则只能用后者
same_acc.display(cout);
Account func_ret = example(myacc);//复制初始化,返回aa的副本到func_ret中
func_ret.display(cout);
Account *pacc = new Account(myacc);//使用了复制构造函数, 使用myacc复制初始化一个匿名对象,并将新对象的地址赋给pacc指针。
pacc->display(cout);
vector<Account> avec(5);//复制初始化,先用Account构造函数创建一个临时值初始化avec,再使用复制构造函数将临时值复制到avec的每个元素
for (vector<Account>::iterator it = avec.begin(); it != avec.end(); ++it)
{
it->display(cout);
}
Account aaray[] = {string("A"),string("B"),string("C"),Account()};//复制初始化,先用构造函数创建临时对象,然后用复制构造函数复制到各元素
for (int i = 0; i != 4; ++i)
{
aaray[i].display(cout);
}
return 0;
}
Account example(Account acc)//使用了复制构造函数,复制实参到acc.注意:形参和返回值是非引用类型的,否者不会使用复制构造函数
{
Account aa(acc);//复制初始化,将acc复制到aa中
//......
return aa;//使用了复制构造函数,返回aa的副本
}