使用Constructor参数实例化一个类对象与不带参数的*运算符之间的区别C++
在C++中学习OOPS概念时,我遇到了本教程链接。 http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm使用Constructor参数实例化一个类对象与不带参数的*运算符之间的区别C++
在基类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;
}
声明
Shape *shape;
不创建类形状的任何实例。 它声明了一个变量,该变量是类型为Shape *
的指针,并且未被初始化,即它具有不确定的值,前提是该声明声明局部变量。
至于构造函数,那么带有两个参数的类的唯一构造函数也是该类的默认构造函数,因为每个参数都有一个默认参数。
Shape(int a=0, int b=0)
^^^ ^^^
{
//...
}
因此可以写例如被创建的对象的
Shape sh;
和数据成员将被这些默认参数进行初始化。 此声明等效于
Shape sh(0, 0);
Shape *shape;
这不会创建一个Shape对象。它创建一个未初始化的Shape指针,该指针可用于存储Shape对象(或从Shape派生的类的对象)的地址。你可以看到它在你链接到页面中:
// store the address of Rectangle
shape = &rec;
// call rectangle area.
shape->area();
声明一个Shape*
不是一个运营商,这是一个不同的类型。该类型是指向形状的指针。这与以多种方式直接声明形状不同:
- 它不是形状,而是指向形状的变量。当使用继承时,我们可以使用指向基类的指针(
Shape*
)指向子类(Rectangle
)。 - 请注意,我没有在
Rectangle
之后放*
。这是因为指针指向一个类的实例,而不是指向另一个指针,除非指针指向了指针。 - 声明
Shape*
时,构造函数未被调用,因为指针将指向现有实例或新实例,使用new
运算符或不指定任何实例。 - 指向无的指针通常称为空指针。
- 你应该阅读关于多态性之前的指针和引用。
没有参数声明的指针有一个未定义的值。如果你想要一个空指针,你应该这样声明:
Shape* ptrToShape = nullptr;
非常感谢 – Gangadhar
显示你的代码。 –
与其依靠人们阅读链接的文章(当数年后有人发现此问题时可能不存在),请将相关代码示例作为问题的一部分发布,以便我们可以自行理解它。堆栈溢出不仅仅是为了你现在需要的答案,而是其他人未来的相同问题。 –
道歉。在上面的第一个问题中添加了代码。谢谢 – Gangadhar