C++ 构造函数的问题。这里究竟初始化了什么?
Problem with C++ Constructor. What exactly is getting initialized here?
#include<bits/stdc++.h>
using namespace std;
class Vehicle
{
private:
int speed;
public:
Vehicle(int x)
{
speed=x;
cout << "Vehicle's parametrized constructor called" << endl;
}
};
class Car : public Vehicle
{
public:
Car() : Vehicle(5)
{
cout << "Car's constructor called" << endl;
}
};
int main()
{
Car a;
}
输出-
车辆的参数化构造函数调用
汽车的构造函数称为
由于访问说明符是public,因此速度不会被继承。 Car中没有速度成员,5分配给什么?
Since the access specifier is public, speed is not inherited.
这是误会。派生 class 确实继承了基础 class 的所有成员。访问说明符控制的只是被继承的class是否可以访问成员。 Car
无法直接访问 speed
但成员在那里。
请记住,public 继承为 "is-a" 关系建模。 Car
是 Vehicle
。如果 Car
没有 speed
成员,它就不会是 Vehicle
。
您可以使用显示功能自行测试。
将此函数添加到 class Vehicle
下的 public 访问说明符:
void display() { std::cout<<speed; }
现在从 class Car
派生的一个对象,在 main()
中调用这个函数:
Car a; a.display();
它会输出5
,这是你在derivedclassCar
中初始化的变量speed
的值,from baseclassVehicle
.
Since the access specifier is public, speed is not inherited.
无论强加的访问说明符如何,所有变量都是继承的。不同之处在于它们不能直接访问。对于像 speed
这样的 private
成员,您需要通过 public 成员函数访问它们,就像我在上面所做的那样。
What does 5 get assigned to as there is no speed member in Car?
它被分配给 Car
对象中的派生变量 speed
。
Class Car 派生自 Vehicle。当您创建 class Car 的对象时,它还包含 Vehicle 的内存。这意味着 class Car 的对象有 Vehicle 作为成员。
希望this link大家多多理解
当您创建 Car 的对象时,它会调用 class Car 的构造函数,该构造函数在执行 Car 构造函数的主体之前在内部调用 class Vehicle 的构造函数。
Car() : Vehicle(5)
这是一种初始化 Vehicle class 成员的方法。
有一个Initializer List in C++ and you can read here的概念,什么时候用比较好
Value 5 被传递给 Vehicle 的构造函数并最终存储在 class 成员 speed 中。在您的代码中,如果您打印 speed,您会看到,无论您传递的是什么值,都会存储在那里。
#include<bits/stdc++.h>
using namespace std;
class Vehicle
{
private:
int speed;
public:
Vehicle(int x)
{
speed=x;
cout << "Vehicle's parametrized constructor called" << endl;
}
};
class Car : public Vehicle
{
public:
Car() : Vehicle(5)
{
cout << "Car's constructor called" << endl;
}
};
int main()
{
Car a;
}
输出-
车辆的参数化构造函数调用
汽车的构造函数称为
由于访问说明符是public,因此速度不会被继承。 Car中没有速度成员,5分配给什么?
Since the access specifier is public, speed is not inherited.
这是误会。派生 class 确实继承了基础 class 的所有成员。访问说明符控制的只是被继承的class是否可以访问成员。 Car
无法直接访问 speed
但成员在那里。
请记住,public 继承为 "is-a" 关系建模。 Car
是 Vehicle
。如果 Car
没有 speed
成员,它就不会是 Vehicle
。
您可以使用显示功能自行测试。
将此函数添加到 class Vehicle
下的 public 访问说明符:
void display() { std::cout<<speed; }
现在从 class Car
派生的一个对象,在 main()
中调用这个函数:
Car a; a.display();
它会输出5
,这是你在derivedclassCar
中初始化的变量speed
的值,from baseclassVehicle
.
Since the access specifier is public, speed is not inherited.
无论强加的访问说明符如何,所有变量都是继承的。不同之处在于它们不能直接访问。对于像 speed
这样的 private
成员,您需要通过 public 成员函数访问它们,就像我在上面所做的那样。
What does 5 get assigned to as there is no speed member in Car?
它被分配给 Car
对象中的派生变量 speed
。
Class Car 派生自 Vehicle。当您创建 class Car 的对象时,它还包含 Vehicle 的内存。这意味着 class Car 的对象有 Vehicle 作为成员。 希望this link大家多多理解
当您创建 Car 的对象时,它会调用 class Car 的构造函数,该构造函数在执行 Car 构造函数的主体之前在内部调用 class Vehicle 的构造函数。
Car() : Vehicle(5)
这是一种初始化 Vehicle class 成员的方法。 有一个Initializer List in C++ and you can read here的概念,什么时候用比较好
Value 5 被传递给 Vehicle 的构造函数并最终存储在 class 成员 speed 中。在您的代码中,如果您打印 speed,您会看到,无论您传递的是什么值,都会存储在那里。