在使用C ++学习OOPS概念时,我遇到了这个教程链接。 http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm
在基类Shape
中,它有两个参数的构造函数来设置其受保护的变量,在main()
中,我认为为类Shape
创建对象的唯一方法是通过执行像Shape shape(2,4)
这样的东西来匹配Shape
类中的构造函数。
有人可以说没有任何参数的实例化Shape *shape
如何工作,并且说明了Shape shape(2,4)
和Shape *shape
之间创建对象的区别。
#include <iostream>
using namespace std;
class Shape{
protected:
int w,h;
public:
Shape(int a, int b){
w=a;
h=b;
}
int area(){
cout << "Shape class area" << endl;
return 0;
}
};
class Rect:public Shape{
public:
Rect(int a, int b):Shape(a,b) {}
int area(){
cout <<"Rect class area " << endl;
return w*h;
}
};
class Tri:public Shape{
public:
Tri(int a, int b):Shape(a,b) {}
int area(){
cout << "Tri class area" << endl;
return (w*h)/2;
}
};
int main(){
Shape *shape;
Rect r(4,5);
Tri t(4,5);
shape=&r;
shape->area();
shape=&t;
shape->area();
return 0;
}
答案 0 :(得分:1)
Shape *shape;
这不会创建Shape对象。它创建一个未初始化的Shape指针,该指针可用于存储Shape对象(或从Shape派生的类的对象)的地址。您可以在链接到的页面中看到它:
// store the address of Rectangle
shape = &rec;
// call rectangle area.
shape->area();
答案 1 :(得分:1)
声明
Shape *shape;
不会创建类Shape的任何实例。
它声明了一个变量,它是一个Shape *
类型的指针,如果声明声明了一个局部变量,那么它没有被初始化,因为它具有不确定的值。
对于构造函数,那么具有两个参数的类的唯一构造函数也是该类的默认构造函数,因为每个参数都有一个默认参数。
Shape( int a=0, int b=0)
^^^ ^^^
{
//...
}
因此你可以写例如
Shape sh;
将使用这些默认参数初始化创建的对象的数据成员。 该声明等同于
Shape sh( 0, 0 );
答案 2 :(得分:0)
声明Shape*
不是运算符,它是一种不同的类型。类型是指向形状的指针。这与通过多种方式直接声明形状不同:
Shape*
)的指针指向子类(Rectangle
)。*
之后添加Rectangle
。这是因为指针指向一个类的实例,而不指向另一个指针,除非你有指向指针的指针。Shape*
时,不会调用构造函数,因为您的指针将使用new
运算符指向现有实例或新实例,或者不指向任何实例。没有参数声明的指针具有未定义的值。如果你想要一个空指针,你应该这样声明:
Shape* ptrToShape = nullptr;