1、初始化列表
作用:C++提供了初始化列表语法,用来初始化属性。
语法:
构造函数():属性1(值1),属性2(值2)...{}
示例:
#include<iostream>
using namespace std;
class person
{
public:
//传统的赋值
person(int a, int b, int c)
{
m_a = a;
m_b = b;
m_c = c;
}
int m_a;
int m_b;
int m_c;
};
int main()
{
person p(1, 2, 3);
cout << "m_a=" << p.m_a << endl;
cout << "m_b=" << p.m_b << endl;
cout << "m_c=" << p.m_c << endl;
return 0;
}
结果:
代码:
#include<iostream>
using namespace std;
class person
{
public:
//初始化列表初始化属性
person():m_a(1),m_b(2),m_c(3){}
int m_a;
int m_b;
int m_c;
};
int main()
{
person p;
cout << "m_a=" << p.m_a << endl;
cout << "m_b=" << p.m_b << endl;
cout << "m_c=" << p.m_c << endl;
return 0;
}
结果:
由于这种代码的固定性,一般这样使用初始化列表
代码:
#include<iostream>
using namespace std;
class person
{
public:
//初始化列表初始化属性,意思是:m_a=a,m_b=b,m_c=c
person(int a,int b,int c):m_a(a),m_b(b),m_c(c){}
int m_a;
int m_b;
int m_c;
};
int main()
{
person p(5,4,1);
cout << "m_a=" << p.m_a << endl;
cout << "m_b=" << p.m_b << endl;
cout << "m_c=" << p.m_c << endl;
return 0;
}
结果:
2、拷贝构造函数调用时机
C++中拷贝构造函数调用时机通常有三种情况:
(1)使用一个已经创建完毕当代对象来初始化一个新对象。
(2)值传递的方式给函数参数传值。
(3)以值方式返回局部对象。
示例://1、使用一个已经创建完毕的对象来初始化一个新对象
代码:
#include<iostream>
using namespace std;
class person
{
public:
person()
{
cout << "person默认构造函数调用" << endl;
}
~person()
{
cout << "person析构函数调用" << endl;
}
person(int age)
{
m_age = age;
cout << "person有参构造函数调用" << endl;
}
person(const person& p)
{
m_age = p.m_age;
cout << "person拷贝构造函数调用" << endl;
}
int m_age;
};
//1、使用一个已经创建完毕的对象来初始化一个新对象
void test01()
{
person p1(20);
person p2(p1);
cout << "p2的年龄为:" << p2.m_age << endl;
}
int main()
{
test01();
return 0;
}
结果:
示例://2、值传递的方式给函数参数传值
#include<iostream>
using namespace std;
class person
{
public:
person()
{
cout << "person默认构造函数调用" << endl;
}
~person()
{
cout << "person析构函数调用" << endl;
}
person(int age)
{
m_age = age;
cout << "person有参构造函数调用" << endl;
}
person(const person& p)
{
m_age = p.m_age;
cout << "person拷贝构造函数调用" << endl;
}
int m_age;
};
//2、值传递的方式给函数参数传值
void dowork(person p)
{
}
void test02()
{
person p;
dowork(p);
}
int main()
{
test02();
return 0;
}
结果:
示例://值方式返回局部对象
代码:
#include<iostream>
using namespace std;
class person
{
public:
person()
{
cout << "person默认构造函数调用" << endl;
}
~person()
{
cout << "person析构函数调用" << endl;
}
person(int age)
{
m_age = age;
cout << "person有参构造函数调用" << endl;
}
person(const person& p)
{
m_age = p.m_age;
cout << "person拷贝构造函数调用" << endl;
}
int m_age;
};
//值方式返回局部对象
person dowork()
{
person p1;
return p1;
}
void test03()
{
person p2= dowork();
}
int main()
{
test03();
return 0;
}
结果:
3、构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数:
(1)默认构造函数(无参,函数体为空)
(2)默认析构函数(无参,函数体为空)
(3)默认拷贝构造函数,对属性进行值拷贝。
构造函数调用规则如下:
(1)如果用户定义有参构造函数,C++不再提供默认无参构造函数,但是会提供默认拷贝构造函数。
(2)如果用户定义拷贝构造函数,C++不再提供其他构造函数。