构造函数不新奇,这里讲的也是老调重弹,只是为了自己熟悉,要讲的就是默认构造函数,含实参的默认构造函数,以及相应的调用初始化;
class A
{
int i;
char c;
string s;
public:
A(){}
void show()
{
cout<<"i"<<i<<" "<<"c:"<<c<<" "<<"s:"<<s<<endl;
}
};
上面的A(){}就是一个默认构造函数,编译器一般情况下会为我们合成这么一个构造函数,个人感觉功能和上面的A(){}一样,只不过这是我们人为写的,那么只要是我们写了一个构造函数的话,相应的编译器就不去帮我们合成了,也就是说假如我们如下的话:
#include <string>
class A
{
int i;
char c;
string s;
public:
A(int j,char s,string ss):i(j),c(s),s(ss){}
void show()
{
cout<<"i"<<i<<" "<<"c:"<<c<<" "<<"s:"<<s<<endl;
}
};
int main()
{
A a;
return 0;
}
编译器是会报错的,因为我们是使用一个不接受参数的a来初始化,但是相应的编译器找不到这么一个默认的无参的构造函数,也就报错了。
此外就是关于含参数的默认构造函数,也就是我们称的默认实参的构造函数,也就是在构造函数的小括号中对于后面要初始化的值进行一个人为设定的值,在初始化列表中设置也是可以的。经过验证这个玩意和默认构造函数功能一样,编译器在含有人为设定的默认构造函数和默认实参的构造函数的时候会出现一个歧义,如下:
#include <string>
class A
{
int i;
char c;
public:
A(){}
A(int j=0,char s='a'):i(j),c(s){}
void show()
{
cout<<"i"<<i<<" "<<"c:"<<c<<" "<<"s:"<<s<<endl;
}
};
int main()
{
A a;
return 0;
}
也就是二者的功能是一样的,那么编译器在为下面这样的一个a进行构造的时候便会选择歧义了。如果是把A(){}注释掉的话,就会有i=0,c='a'的这么一个出现了。
此外对于非默认的构造函数,初始化的时候,实例化对象的初始化元素个数必须和构造函数中的一样。
实际上构造函数也是函数,也满足函数的性质,比如说
A(int j=0):i(j){}
那么的话,对于未初始化的char c就要调用内置类型的构造了,看a实例化的位置,具体的情况,对于int也是一样的。这里的话就算是你在实例化的时候给a附了相应的各种需要的值的话也是无用功,进入不了类型的内部了,相应的部分只能够被编译器进行初始化了,此外对于那些const 引用还有没有默认构造函数的类类型是要在初始化列表中初始化