1.在main函数之前执行一段代码
主要代码:
class A
{
public:
A() { cout << "A" << i<<endl; }
};
A a; //全局对象
void main()
{
cout << "main begin" << endl;
}
运行结果:
由上述代码可以得出,主函数之前时可以执行一段代码的。
2.对象数组
主要代码:
class A
{
public:
A() { cout << "A" << i<<endl; } //无参构造函数
//A(int i = 0) { cout << "A" << i<<endl; } //带默认值的构造函数
};
void main()
{
A a[5]; //对象数组 a[0]~a[4]都是对象
}
运行结果:
3.构造函数作为类型转换
构造函数除了能构造对象,还能作为类型转换,将一个基本数据类型转换为对象,直接赋值给对象。
但是当前构造函数必须带参数,才能做这个转换。
主要代码:
class A
{
public:
A(int i = 0) { cout << "A" << i << endl; }
};
void main()
{
A b = 10;
A c=A(10);
}
上述代码中主函数中的A b = 10;
本来是声明了一个无名对象A(10)
,把无名对象给了b。编译器可以自动将A b=A(10);
所以就直接写为A b = 10;
优化之后看起来就是直接把一个整型赋给一个对象,就是用整型去给一个对象去构造,要用这个整型去给对象构造, 那么构造函数必须由整型作为参数。
运行结果:
explicit的作用:
class A
{
public:
explicit A(int i = 0) { cout << "A" << i << endl; }
};
void main()
{
A b = 10; //编译错误
}
写了explicit的作用是构造函数不能作为类型转换,只能作为构造函数的作用。