1. To create an object composed of objects.
2. To use this pointer.
主要分析函数调用机制
.h文件:
#include<iostream>
using namespace std;
class X{
public:
X(){
cout<<"这是X的默认构造函数\n";
}
X(X& t){
cout<<"这是X的复制构造函数\n";
}
X& operator=(X& s){
cout<<"这是X的赋值构造函数\n";
return *this;
}
~X(){
cout<<"这是X的析构函数\n";
}
};
class A{
public:
A(X x)
{
cout<<"这是A的构造函数\n";
c=x
}
~A(){
cout<<"这是A的析构函数\n";
}
private:
X c;
};
.cpp文件:
#include"XYAB.h"
int main()
{
X g;
A j(g);
}
输出:
1) 实例g的创建
2) 值传,x(g),即复制构造函数的调用
3) 当属性有对象类型X时,在构造A之前要先构造X(A的小弟,即A要“爱幼”)
4) 执行A构造函数的函数体的开始标志
5) 运算符重载函数的调用
.h文件(运算符重载函数返回类型去掉引用):
#include<iostream>
using namespace std;
class X{
public:
X(){
cout<<"这是X的默认构造函数\n";
}
X(X& t){
cout<<"这是X的复制构造函数\n";
}
X operator=(X& s){
cout<<"这是X的赋值构造函数\n";
return *this;
}
~X(){
cout<<"这是X的析构函数\n";
}
};
class A{
public:
A(X x)
{
cout<<"这是A的构造函数\n";
c=x
}
~A(){
cout<<"这是A的析构函数\n";
}
private:
X c;
};
输出:
6) 结果返回时会出现X temp(*this)(临时变量调用赋值构造函数)的情况。
.h文件(尽量多使用&):
#include<iostream>
using namespace std;
class X{
public:
X(){
cout<<"这是X的默认构造函数\n";
}
X(X& t){
cout<<"这是X的复制构造函数\n";
}
X& operator=(X& s){
cout<<"这是X的赋值构造函数\n";
return *this;
}
~X(){
cout<<"这是X的析构函数\n";
}
};
class A{
public:
A(X& x)
{
cout<<"这是A的构造函数\n";
c=x
}
~A(){
cout<<"这是A的析构函数\n";
}
private:
X c;
};
输出:
.h文件(初始化列表):
#include<iostream>
using namespace std;
class X{
public:
X(){
cout<<"这是X的默认构造函数\n";
}
X(X& t){
cout<<"这是X的复制构造函数\n";
}
X& operator=(X& s){
cout<<"这是X的赋值构造函数\n";
return *this;
}
~X(){
cout<<"这是X的析构函数\n";
}
};
class A{
public:
A(X x):c(x)
{
cout<<"这是A的构造函数\n";
}
~A(){
cout<<"这是A的析构函数\n";
}
private:
X c;
};
输出:
对比分析:
1
使用初始化列表的优越性跃然文档上
2
尚未总结出来两者之间的优越性哪个好