在C++中,结构体与类是相似的,他们可以互相进行继承操作
比如我们构造一个类A和一个继承A的结构体B
class A {
public:
int a;
};
struct B:A
{
};
他们之间可以是相互的继承关系,因此执行以下操作是被允许的
B b;
b.a = 0;
cout << b.a << endl; //编译能通过,B是struct,B的基类是A是通过public继承,所以能通过
结构体中可以缺省初始化对象,方法如下:
对象的初始化:
struct point{
int x;
int y;
};
int main()
{
point p[3]{{1,2},{3,4},{5,6}};
return 0;
}
同时,在一个struct里面,Universal Construction会按照成员变量的定义顺序挨个初始化struct每一个成员,但是,当有构造函数的时候,就会转去调用构造函数
struct point:
{
Int x;
Int y;
Point(int v)
{
}
}
此时上面main()中的初始化方法就失效了,必须按照指定的初始化法进行初始化操作(这里是传入一个参数)
如果我们有多种构造方法该怎么办呢?这时候就可以进行构造函数的重载操作
struct point
{
int x;
int y;
point() :x( 0 ), y( 0 ) {};
point(int v) :x(v), y(v) {};
point(int theX, int theY) :x(theX), y(theY) {};
};
这时我们就可以传入不同的参数进行不同的构造:
(1)不使用构造函数,则会自动把两个参数初始化为0
(2)传入一个参数的构造函数,则会把两个参数初始化为传入的参数
(3)传入两个参数,则分别进行赋值
其中,C++中有一种default构造法,叫做缺省构造函数:
struct DefaultPoint
{
int x{};
int y{};
int z{};
DefaultPoint() = default;
};
这样调用,如果不调用构造函数,则全部初始化为0,然后根据参数定义的顺序进行赋值,方法如下:
DefaultPoint AAA{1,2};
cout << AAA.z << endl;
这样使用,x就为1,y就为2,z默认就为0
如果不进行构造,则x,y,z都会为默认为0
这里可能会有一些混淆,为什么有的时候不写缺省构造函数就是有一个缺省构造函数,有些时候就不是呢?因为编译器只会在这个类没有任何构造函数被写出来的情况下会替我们生成一个缺省构造函数,除非我们使用default。具体到我们的例子里,因为point已经有point(int v)和point(int theX, int they)两个构造函数了,因此如果我们不写缺省构造函数,那么编译器会认为这个类没有缺省构造函数